一共有8中数据类型,常用的是5种
String
String字符串
Int整数
Float字符串
常用操作命令
set young 2673 [EX 过期时间(秒)| PX 过期时间 毫秒] [NX key 不存在操作才能成功| XX 只有Key存在的时候才能成功]
mset young 2673 hui 666 批量set
mget young hui 批量get
strlen young value长度
append young good 给value后面追加
getrange young 0 8 返回value的指定范围的值,-1为所有
ncr young 对value进行递增1
incrby young 100 指定递增步幅
decr young 递减
decrby young 100 指定步幅递减
set f 2.6 设置浮点数
incrbyfloat f 7.3 对浮点数进行递增
位操作
一个字符是按8位二进制存储的
setbit k1 6 1修改value指定位上的值
getbit k1 0 获取指定位上的值
bitcount k1 查看key里有多少个count
bitpos k1 1 获取第一个1的下标
BITOP AND destkey srckey1 ... srckeyN,对一个或多个key求逻辑与,并将结果保存到destkey
BITOP OR destkey srckey1 ... srckeyN,对个或多个key求逻辑或,并将结果保存到destkey
BITOP XOR destkey srckey1 ... srckeyN,对个或多个key求逻辑异或,并将结果保存到destkey
BITOP NOTdestkey srckey1 ... srckeyN,对个或多个key求逻辑非,并将结果保存到destkey
应用场景
-
缓存
-
分布式session
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> -
set NX EX 分布式锁
-
incr 全局ID
-
incr 计数器
-
incr 限流
-
位操作 统计
Hash
redis中,key可以分层,key:一个冒号就是一层
set food:fruit:apple 1
set foot:fruit:banana 2
set food:meet:pork 3
set foot:meet:beaf 4
在hash中,一个key对应多个 field和value的键值对
value只能是字符串,不能是hash的嵌套
String与Hash的区别
-
使用String会创建很多的key,使用Hash就会减少空间
-
可以减少key冲突
-
减少资源消耗
-
String可以单独设置过期时间,Hash只能针对key设置过期时间,不能针对field设置过期时间
-
String可以做bit操作,Hash没有位操作
-
单个Hash的数据量很大的时候,Hash不会分散存储,会造成节点存储压力过大
Hash操作命令
hset h1 f 6 给key为h1的hash表中的f字段赋值
hmset h1 a 1 b 2 c 3 d 4 批量赋值
hget h1 a 获取key下制定field的值
hmget h1 a b c d 批量get
hkeys h1
hvals h1
hgetall h1
hget exists h1 a 判断是否存在,存在则返回1
hdel h1
hlen h1 元素个数
hincrby h2 a 10 对指定的field递增,需要递减时传负数即可
hincrbyfloat h2 b 7.3 对指定的field递增浮点数
应用场景
存储hash表
如购物车
key:用户id
field:商品id
value:商品数量
+1:hincrby id 1
-1:hdecrby id -1
删除:hdel
全选:hgetall
商品数:hlen
List
有序,左边是列表头,右边是列表尾,顺序是从左到右
元素可以重复
一个列表可以容纳2^32-1个元素
常用命令
lpush queue c 从队头插入
lpush queue d e
rpush queue f g 从队尾插入
lpop queue 从队头弹出一个元素
rpop queue 从队尾弹出一个元素
lindex queue 0 从左边获取第一个元素
lrange queue 0 -1 从左边范围获取列表的元素
blpop 阻塞弹出
lrem key count value 将列表中前count(数字)次出现的值为value(元素)删除
应用场景
消息队列
rpush lpop 队尾入队,队头出队,先进先出
blpop 从队头弹出元素,如果没有元素,会阻塞等待,直到队列里面有元素
brpop
blpop key1 timeout 从列表key1的队头弹出元素,如果没有就进行阻塞,阻塞timeout时间
Set
无序集合,元素不能重复,可以容纳2^32-1个元素
常用命令
sadd myset a b c d e f g 插入元素到set中
smembers myset 展示所有元素
scard myset 统计元素数量
srandmember key 随机返回一个元素
spop myset 随机返回并删除
srandmember myset 2 随机返指定个数元素
srem myset d e f 移除指定元素
sismember myset a 判断元素是否在set中
集合之间的操作
获取差集(只在第一个集合,不在第二个集合)要注意顺序
sdiff set1 set2
获取交集(在两个集合中都存在)
sinter set1 set2
获取并集(合并后去重)
sunion set1 set2
应用场景
抽奖
spop 随机返回并移除
点赞、签到、打卡
用like:t1001来维护t1001这条微博的所有点赞用户
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001
商品标签
用tags:i5001来维护商品所有的标签
sadd tags:i5001 画面清晰
sadd tags:i5001 色彩好
sadd tags:i5001 流畅
商品筛选
sadd brand:apple iPhone
sadd brand:ios iPhone
sadd screensize:6.0-6.24 iPhone
sadd screentype:lcd iPhone
筛选商品,苹果的,ios的,屏幕在6.0-6.24之间的,屏幕材质是lcd屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd
用户关注模型
互相关注
sismember bob:follow me
sismember me:follow bob
共同关注
sinter me:follow bob:follow
我关注的人也关注了他?
leo是不是我关注的人里面关注的用户?
sismember :follow leo
可能认识的人
sdiffstore mayknow me:follow joy:follow 取出差集,存到新的集合中
ZSet
有序集合,每个元素有个分值,分值相同则按照key的ASCII码来排序,分值越小或者ASCII码越小,就会排在越前面
常用命令
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python 添加元素,元素的分值写在元素的前面
zrange myzset 0 -1 withscores 按照下标获取元素,withscores 会显示分值
zrevrange myzset 0 -1 withscores zrange的反转
带rev的命令都是反转操作
zrangebyscore myzset 20 30 withscores 按照分值的范围进行查找
zrem myzset php cpp 移除指定元素
zcard myzset 统计元素个数
zincrby myzset 5 python 给python元素的分值增加5分
zrank myzset python 获取元素的下标
zscore myzset java 获取元素的分值
zcount myzset 20 60 统计指定分值区间内的元素个数
应用场景
排行榜
id为6001的新闻点击数加一
zincrby hotNews:20211122 1 n6001
获取今天点击最多的15条
zrevrang hostNews:20211122 0 15 withscores
Geo、HyperLogLogs
Geo Spatial
用来保存地理位置信息的数据类型,也就是经纬度信息
常用命令
geoadd citys 121.48 31.22 sh 113.01 28.19 cs 存储经纬度信息
geopos citys cs 获取指定城市经纬度
geodist citys sh cs km 计算两个元素之间的距离,最后的属性是单位
georadius citys 113.01 28.19 5 km 距离指定经纬度5km以内的元素
geoadd citys 112.95 28.18 yl
georadiusbymember citys cs 20 km 距离指定元素不超过20km的元素
HyperLogLogs
提供一种基于基数的统计方法
可以用很少的内存计算很大的基数
会存在一定的误差
pfadd log 1 2 3 4 5 6 7 8 添加元素
pfcount log 统计元素
pfadd qs a b c d e f g
pfcount qs
pfmerge result log qs 合并两个hyperloglog