redis的基础知识和五大基本类型
redis的基础知识和五大基本类型
Redis(Remote Dictionary Server):远程字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,key-value数据库,提供多种语言的API
redis的特点与应用场景
特点
-
速度快
内存存取 redis用c语言实现,执行速度快 redis采用单线程,避免多线程资源竞争的问题 redis源码精简
-
不仅支持简单的key-value类型的数据,还提供list,set,hash,zset等数据结构的存储
-
丰富的功能
提供key过期功能,用于实现缓存 提供发布订阅功能,用于消息队列 支持lua脚本功能 提供简单的事务功能 提供pipeling功能,可以多条命令一次io,减少网络开销
-
简单稳定
-
客户端语言多(支持java,python,c,c++,php等等)
-
持久化
RDB与AOF,数据写入磁盘,重启之后依然可以使用
-
主从复制
-
高可用与分布式
应用场景
- 缓存
- 排行榜
- 计数器
- 消息队列
- 社交网络
基本命令
redis默认有16个数据库,客户端默认连接的是第0个,以下是进入客户端后的常见命令(redis有服务端和客户端,进入相应路径执行./redis-cli即可)
针对连接的命令
quit: 关闭连接
auth: 密码认证
ping: 检查是否连接上
shutdown: 停止redis服务
针对value操作的命令
select n: 选择第n个数据库
flushdb: 清除当前数据库的所有key
flushall: 清除所有数据库的key
exist key: 确认一个key是否存在
del key: 删除一个key
type key: 返回值的类型
dbsize: 返回当前数据库中的key数量
expire key n: 设定key的过期时间,单位为秒
ttl key: 获取key剩余的生存时间
clear: 清空当前命令行
keys pattern: 查询所有符合给定模式匹配的键的命令
pattern: Glob风格模式,以下是常用的特殊字符
*: 匹配任意数量的任意字符
?: 匹配任意一个字符
[]: 匹配括号内的任意一个字符
\: 转义字符,用于匹配特殊字符本身
eg: 查询所有以"user:"开头的键
keys user:*
注:keys命令在执行时会遍历整个数据库来查找所有匹配到的键,这个过程是阻塞的。如果数据库中存在大量的键,keys命令会导致redis服务器在一段时间内无法处理其他命令。在生产环境中建议使用scan命令,它以非阻塞的方式逐步迭代数据库中的键。
scan cursor [MATCH pattern] [COUNT count] : 用于迭代数据库中所有符合给定模式匹配的键的命令
cursor: 游标参数,从0开始的整数值,每次执行scan命令时,都需要传递上一次命令返回的游标值,直到返回游标值为0时,表示迭代完成。
MATCH pattern: 可选参数,用于指定匹配的模式,同样是Glob风格模式,以下是常用的特殊字符
*: 匹配任意数量的任意字符
?: 匹配任意一个字符
[]: 匹配括号内的任意一个字符
\: 转义字符,用于匹配特殊字符本身
COUNT count: 可选参数,它指定了每次迭代返回键的数量。这个参数只是一个近似值,实际返回的键数量可能会多于或少于这个数。
命令返回一个包含两个元素的数值:
第一个元素是新的游标值,用于下一次迭代。
第二个元素是一个匹配到的键的列表。
eg:
游标从0开始,查找所有匹配"new:user:*"模式的键,并且尽可能每次返回接近1000个键
scan 0 MATCH "new:user:*" COUNT 1000
注: 除了scan命令外,还提供了其他的迭代命令
SSCAN: 迭代集合中的元素
HSCAN: 迭代哈希表中的键值对
ZSCAN: 迭代有序集合中的元素及其分数
五大基本类型与常用命令
String类型
String类型用于存储字节序列,包括文本、序列化对象和二进制数组
使用场景:对象缓存存储,计数器
默认情况下,单个Redis字符串最大为512MB
String类型的常用命令
set key value: 设值名为key的value值
get key: 获取key中的value值
strlen key: 获取key中value值的长度
incr key: 将key中的value值增加1,若之前key为空则值为1
decr key: 将key中的value值减少1,若之前key为空则值为-1
incrby key n: 将key中的value值增加n
decrby key n: 将key中的value值减少n
getrange key n m: 截取key中value值中的第n-m位的值,当为0 -1时则获取全部字符串
setex key n value: 设置名为key的value值存活时间为n妙
setnx key value: 如果key不存在则设置key值为value,反之则不赋值
mset key1 value1 key2 value2: 同时设置多个键值对
mget key1 key2: 同时获取多个值
msetnx key1 value1 key2 value2: 原子性设置多个键值对,要么一起成功,要么一起失败
getset key value: 如果key值存在则更新为value值并获取到旧值,如果key不存在则返回空(nil)
可以用分隔符的方式存同类别不同参数的数值
如:set obj:1:id value1 obj:1:name value2
通过加前缀的方式来存入对象的参数,不过也可以转换成json格式作为一个字符串存入
List类型
List类型的value值为链表
使用场景:实现堆栈和队列,为后台工作系统构建队列管理
List的最大长度为2^32-1(4294967295)个元素
List类型的常用命令
将链表视为队列(先进先出)FIFO
lpush key value1 value2: 从左边添加1-n个value值
rpop key n: 从右边取出1-n个value值
将链表视为堆栈(先进后出)FILO
lpush key value1 value2: 从左边添加1-n个value值
lpop key n: 从左边取出1-n个value值
--
lange key n m: 返回n-m区间的值,若0 -1则获取全部的值
llen key: 返回key值的长度
lmove key1 key2 left|right left|right: 从一个链表中取出并放入另一个链表中,可以定义从左还是右边取与存
Set类型
Set类型的value是一个无序不重复集合
使用场景:跟踪唯一项目,表示关系,执行常见的集合运算,随机抽取
Set最大为2^32-1(4294967295)个成员
Set类型的常用命令
sadd key value1 value2: 添加新成员到集合中
smembers key: 查看指定集合中的成员
sismember key value: 判断value值是否在该集合中
scard key: 获取指定集合中成员个数
srem key value: 移除元素中指定的值
srandmember key n: 随机抽选出n个成员
smove key1 key2 value: 将value值从key1移动到key2
--
集合间运算
sdiff key1 key2: 差集 key1-key2
sinter key1 key2: 交集 key1 ∩ key2
sunion key1 key2: 并集 key1 ∪ key2
Hash类型
Hash类型的value是一个键值对
使用场景:存储基本对象,分组计时器
hash最多存2^32-1(4294967295)个字段-值对
Hash类型的常用命令
hset key field1 value1 field2 value2: 设置多个key-value值
hget key field1: 获取一个字段的值
hmset key field1 value1 field2 value2: 设置多个key-value值
hmget key field1 field2: 获取多个字段值
hdel key field1: 删除指定key中字段-值对
hlen key: 获取key值的字段-值对个数
hexists key field1: 判断key值中的指定字段是否存在
hkeys key: 只获取所有字段
hvals key: 只获取所有值
hgetall key: 获取所有字段-值对
--
hincrby key filed1 n: 指定给key中的字段值加n
Zset类型
Zset类型的value是一个有序(有权重score)不重复的集合
使用场景:排行榜,速率限制器
Zset类型的常用命令
排行榜
zadd key1 score member1 :添加一个权重为score的用户在key中,如果用户已存在则更新权重score
zrangebyscore key -inf +inf :显示全部用户,从小到大排序
zrevrange key 0 -1: 显示全部用户,从大到小排序
zrange key 0 2 rev withscore: 取前三名用户 从大到小排 带分数
zrank key member: 返回用户的排名,从小到大排序
zrevrank key member: 返回用户的排名,从大到小排序
--
zrem key member: 删除key中的指定用户
zcard key: 获取key中的用户总数
zcount key n m: 获取指定区间的用户数量
三种特殊类型与常用命令
geospatial类型
地理空间索引可以存储坐标并搜索它们
使用场景:两地直线距离,附近的人
geospatial类型的常用命令
geoadd key 经度 纬度 地点名: 添加地理位置
有效经度为 -180 到 180 度。
有效纬度为 -85.05112878 到 85.05112878 度
当超过指定范围将会报错
geopos key 地点名: 获取当前地点坐标值
geodist key 地点1 地点2 [M|KM|FT|MI]: 计算两地的直线距离
M:米
KM:千米
FT:英里
MI:英尺
georadius key 目标经度 目标纬度 指定半径 距离单位 [withdist] [withcoord] count n [asc|desc]:
在给定目标坐标后找出在指定半径内的n个地点
withdist 显示直线距离
withcoord 显示经纬坐标
asc:相对于中心,从最近到最远
desc:相对于中心,从最远到最近
georadiusbymember key 地点1 指定半径 距离单位: 找出key中已有的目标地点指定半径内的地点
注意:georadius命令在redis:6.2.0版本开始被视为已弃用,改用geosearch参数替换
geosearch key [frommember|fromlonlat 经度 纬度] [byradius 指定半径 距离单位|bybox 宽度 高度 距离单位] [asc|desc] count n [withdist] [withcoord]:
相对于georadius,geosearch多了一些功能
frommember:使用key中的地点
fromlonlat:使用给定的经纬坐标
byradius:根据给定的圆形区域搜索
bybox:在轴对齐的矩形内搜索
geohash key 地点名: 返回11个字符的geohash字符串
将二维的经纬度转换为一维的字符串,如果两个地点的geohash字符串越接近,则距离越近
由于geo底层的实现原理是zset,可以使用zset命令来操作geo
zrange key 0 -1 :显示地图中所有地点
zrem key 地点: 移除指定元素
Hyperloglog类型
hyperloglog是一种估计集合基数的数据结构。基数:不重复的元素
hyperloglog实现最多使用12kb,并提供0.81%的标准误差,最多可以估算2^64个成员的集合的基数
使用场景:网页的用户访问量(相较于传统的set存储,占用空间更少,目的性更强,前提是允许容错)
Hyperloglog类型的常用命令
pfadd key value1 value2: 存储一个或一组元素
pfcount key: 统计key中的基数数量
pfmerge key1 key2 key3: 合并两组key1 key2 的并集到key3
Bitmaps类型
Bipmaps是字符串类型的扩展,将字符串视为位向量,位存储,只有0和1两个状态,可以执行按位运算
使用场景:统计用户信息,活跃度,打卡(只有两种状态记录的都可以使用bitmaps)
Bitmaps类型的常用命令
以打卡为例,
设置一周的打卡情况
setbit weeksign 0 1
setbit weeksign 1 0
setbit key offset value: 设置存储在offset位(偏移量)上的value(0或1)值
查看周一的打卡情况
getbit weeksign 0
getbit key offset: 查看存储在偏移处的位值
查看一周的打卡情况
bitcount weeksign
bitcount key: 返回位值为1的位数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下