数据类型
String 字符串
Section titled “String 字符串”- string支持序列化
- value最大512MB
- 单值单value
# 设置keyset name '张三'
# 获取valueget name"张三"
# NX:key不存在时才会设置成功,若key存在则不设置set name '张三' NX
# XX:key存在时才会设置成功,若key不存在则不设置set name '张三' XX
# GET:返回指定key的原本value,再设置新value,若key不存在返回nilset name '李四' get
# EX:设置过期时间/秒set token 'xxx' EX 60
# PX:设置过期时间/毫秒set token 'yyy' PX 6000
# EXAT:设置过期时间/秒级时间戳(unix时间戳)set user 'admin' EXAT 1762177700999
# PXAT:设置过期时间/毫秒级时间戳(unix时间戳)set user 'guest' PXAT 1762177700999
# 设置k1 30s后过期set k1 v1 ex 30
# KEEPTTL:修改k1的值,并保留k1的过期时间set k1 v11 KEEPTTL
# 查看过期时间ttl token
# 删除keydel name同时设置/获取多个键值
Section titled “同时设置/获取多个键值”# 同时设置多个键值对mset k1 value1 k2 value2 k3 value3
# 同时获取多个键值对mget k1 k2 k3# 返回值:# value1# value2# value3
# MSETNX:同时设置多个键值对,若其中有一个key存在,则所有设置都不生效msetnx k1 value1 k10 value10获取指定区间范围内的值
Section titled “获取指定区间范围内的值”set k1 abcd123456
# 获取索引0到-1之间的字符getrange k1 0 -1
# 截取字符串[0,4]getrange k1 0 4
# 从索引4开始替换为efghsetrange k1 4 efgh# 返回值:# abcdefgh56set n1 0
# 每次增加1incr n1
# 每次增加10incrby n1 10
# 每次减少1decr n1
# 每次减少5decrby n1 5获取字符串长度和内容追加
Section titled “获取字符串长度和内容追加”set s1 hello
strlen s1 # 获取字符串长度
append s1 world # 追加值,如果不存在,相当于set keyset k1 v1
expire k1 10
# 查看剩余过期时间ttl k1
# 设置k1为v1,并且10s后过期setex k1 10 v1
# 若k1不存在,则设置k1为v2,若存在时设置失败setnx k1 v2getset
Section titled “getset”# 获取k1的原始值,并将value设置为hello,若k1不存在则返回nilgetset k1 hello# 设置一个user:1对象,值为json字符set user:1 {name:zhangsan,age:20}
mset user:2:name lisi user:2:age 18
mget user:2:name user:2:age- 抖音视频点赞
incr video1:1 - 阅读量
incr article1:read
List 列表
Section titled “List 列表”- 是一个双端链表的结构
- l开头表示队列左侧执行,r表示队列右侧执行
# 从左插入,输出 5 4 3 2 1lpush list1 1 2 3 4 5
type list1
# 获取列表所有元素lrange list1 0 -1
# 通过区间获取值。类似于栈,先进后出,后进先出lrange list 0 1
# 从右插入,输出 100 200 300 400 500rpush list2 100 200 300 400 500# 删除并返回列表的第一个元素,输出 5lpop list1
# 删除并返回列表的最后一个元素,输出 1rpop list1通过索引下标获取元素
Section titled “通过索引下标获取元素”# 获取列表索引为0的元素,输出 4lindex list1 0获取列表中元素个数
Section titled “获取列表中元素个数”# 获取列表list1的元素个数,输出 3llen list1删除值相同的元素
Section titled “删除值相同的元素”lpush list1 1 1 2 2 3 3 4 4 5 5 6 1
# 删除列表中2个值为1的元素lrem list1 2 1lpush list1 0 1 2 3 4 5 6 7 8 9
ltrim list1 1 3
# 输出: 8 7 6lrange list1 0 -1移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lpush list1 0 1 2
rpush list2 99 98
# 输出: 0rpoplpush list1 list2
# 输出:0 99 98lrange list2 0 -1lpush list1 0 1 2
# 将列表中指定下标的值替换成另一个值,更新操作lset list1 1 0
# 输出: 2 0 0lrange list1 0 -1已有值插入新的值
Section titled “已有值插入新的值”lpush list1 1 3 5
# 在3前面插入4linsert list1 before 3 4
# 输出: 5 4 3 1lrange list1 0 -1- 微信公众号订阅消息:查看最新订阅号信息:
lrange list:subscribers 0 9,订阅号推送:lpush list:subscribers 11 22
Hash 哈希表
Section titled “Hash 哈希表”- KV模式不变,但V是一个键值对。
Map<String, Map<Object, Object>>
hset user:001 id 001 name zhangsan age 25
# 获取一个字段值hget user:001 id
hget user:001 name
hmset u:2 id 2 name wangwu
hmget u:2 id name
# 获取全部数据hgetall user:001
# 删除指定的key,对应的value也会被删除hdel user:001 age
# 获取某个key的全部数量hlen user:001
# 检查某个字段是否存在hexists user:001 age
# 获取所有字段名hkeys user:001
# 获取所有字段值hvals user:001
# 增加/减少某个字段的整数值hincrby post:10 view 1
# 增加/减少某个字段的浮点数值hincrbyfloat student:10 score 0.5
# 若字段不存在,则设置字段为指定值,若存在了则无效hsetnx user:001 hight 1.80- 购物车(不推荐)
- 新增商品:
hset shopcart:uid1001 pid9918 1 - 再新增商品:
hset shopcart:uid1001 pid9919 1 - 增加商品数量:
hincrby shopcart:uid1001 pid9918 1 - 减少商品数量:
hincrby shopcart:uid1001 pid9918 1 -1 - 获取商品总数:
hlen shopcart:uid1001 - 全部选择商品:
hgetall shopcart:uid1001
- 新增商品:
Set 集合
Section titled “Set 集合”- 成员唯一,无序
- 添加、删除、查找的时间复杂度都是O(1)
# 添加元素sadd set1 1 1 1 2 2 3 3 4 5 5
# 遍历集合中的所有元素smembers set1
# 判断元素是否在集合中sismember set1 3
# 删除元素srem set1 4
# 获取集合中的元素个数scard set1
# 从集合中随机展示2个元素,元素不会被删除srandmember set1 2
# 从集合中随机删除1个元素,元素会被删除spop set1 1
# 将set1中的元素1移动到set2中smove set1 set2 1sadd set1 a b c 1 2
sadd set2 1 2 3 a x
-- 查看属于set1,但不属于set2的元素集合sdiff set1 set2
-- 属于set1或set2 合并后的集合sunion set1 set2
-- 属于set1 set2 共同拥有的元素集合sinter set1 set2
-- 返回给定集合的交集产生的集合的基数-- 不返回结果集,只返回结果的基数sintercard 2 set1 set2- 微信抽奖小程序
- 用户参与抽奖:
sadd suprise uid101 - 显示有多少人参与抽奖:
scard suprise - 抽奖(随机抽2个人,元素不删除):
srandmember suprise 2 - 抽奖(随机抽1个人,元素会被删除):
spop suprise 1
- 用户参与抽奖:
- 微信朋友圈点赞查看共同点赞好友
- 用户点赞:
sadd like:article1001 uid101 uid102 uid103 - 取消点赞:
srem like:article1001 uid102 - 显示共同点赞好友:
smembers like:article1001 - 点赞用户数统计:
scard like:article1001 - 判断某个朋友是否点赞了这篇文章:
sismember like:article1001 uid102
- 用户点赞:
- 可能认识的人/猜你喜欢:
sdiff friends:uid1001 friends:uid1002
Sorted set 有序集合
Section titled “Sorted set 有序集合”- 在set基础上,每一个value值前加一个score分数值
# 向有序集合中加入一个元素和该元素的分数zadd zset1 100 value1 150 value2 200 value3
# 返回索引从0到-1之间的全部元素zrange zset1 0 -1
# 按照元素分数从小到大排序zrange zset1 0 -1 withscores
# 按照元素分数从大到小排序zrevrange zset1 0 -1 withscores
# 获取指定分数范围的元素zrangebyscore zset1 150 200 withscores
# 获取指定分数范围的元素,不包含150 200zrangebyscore zset1 (150 200 withscores
# 获取指定分数范围的元素,不包含150 200,分页显示zrangebyscore zset1 (150 200 withscores limit 0 1
# 获取元素的分数zscore zset1 value1
# 获取集合中元素的数量zcard zset1
# 删除元素zrem zset1 value3
# 增加某个元素的分数zincrby zset1 1 value1
# 统计指定分数范围内的元素个数zcount zset1 100 200
# 弹出最小的一个元素zmpop 1 zset1 min count 1
# 正序获取下标值zrank zset1 value1
# 逆序获取下标值zrevrank zset1 value3- 根据商品销量对商品进行排序显示
- 商品销量:
zadd goods:sellsort 100 product1001 - 销量增加:
zincrby goods:sellsort 5 product1001 - 商品排序显示:
zrevrange goods:sellsort 0 9 withscores
- 商品销量:
Bitmap 位图
Section titled “Bitmap 位图”- 由0和1状态表现的二进制位的bit数组
- 用于状态统计
# 给下标为0赋值valuesetbit b1 0 1
setbit b1 1 1
setbit b1 2 0
# 获取下标为2的value值getbit b1 2
# 统计当前key占用的字节数。超过8个字节自动扩容新的strlen b1
# 统计当前key的value为1的总数bitcount b1
# 统计20251010和20251011两天都签到的人bitop and b2 20251010 20251011
bitcount b2- 用户是否签到,钉钉打卡
- 某电影是否被点击播放过
-- 202501 u1 用户第0天签到setbit sign:u1:202501 0 1
-- 202501 u1 用户第1天签到setbit sign:u1:202501 1 1
-- 202501 u1 用户第2天未签到setbit sign:u1:202501 2 0
-- 查看u1用户第2天是否签到getbit sign:u1:202501 2
-- 统计u1用户202501 第0到30天的签到天数bitcount sign:u1:202501 0 30统计一年共签到的天数
Section titled “统计一年共签到的天数”setbit sign:u1 0 1
setbit sign:u1 364 0
bitcount sign:u1
strlen sign:u1HyperLogLog 基数估计
Section titled “HyperLogLog 基数估计”- 去重复统计功能的基数估计算法。
- 不会存储输入元素本身
- 基数:统计一个集合中不重复的元素个数
pfadd h1 1 2 3 4 5
pfadd h2 1 2 2 2 5 6
# 统计基数pfcount h2
# 合并后,生成新的pfmerge hresult h1 h2
pfcount hresult- 统计某个网站的UV,统计某篇文章的UV(独立访客)
- 用户搜索网站关键词的数量
- 统计用户每天搜索不同词条的个数
Geospatial 地理空间索引
Section titled “Geospatial 地理空间索引”- 主要用于存储地理位置信息,例如添加用户的位置信息,或者查询用户附近的其他用户等
# 添加经纬度坐标geoadd city 116.41 39.90 "北京" 121.47 31.23 "上海" 114.05 22.55 "深圳"
# 查看类型。底层就是zset,可以使用zset命令操作geotype cityzset
# 返回经纬度geopos city 北京 上海
# 返回坐标的hash值geohash city 北京 上海
# 返回两个位置之间的距离,默认米,设置为千米geodist city 北京 上海 km
# 返回以苏州为中心,指定半径范围内的所有位置georadius city 120.59 31.30 100 km withdist withhash count 10 desc
# 返回以上海为中心,指定半径范围内的所有位置georadiusbymember city 上海 100 km withdist withhash count 10 descStream 流
Section titled “Stream 流”- 消息中间件+阻塞队列
队列相关命令
Section titled “队列相关命令”-- 添加消息到队列末尾-- *:让系统自动生成idxadd s1 * id 10 message hello
xadd s1 * k1 v1 k2 v2
type s1-- stream
-- 获取消息列表xrange s1 - + count 1
-- 获取消息列表,倒序xrevrange s1 + -
-- 删除消息xdel s1 1762587010829-0
-- 获取队列长度xlen s1
-- 对stream进行截取-- maxlen:允许最大长度xtrim s1 maxlen 2
-- minid:删除小于指定id的消息xtrim s1 minid 1762587010829-0
-- 获取消息,返回大于指定id的消息-- $: 表示最新的id,比当前最大的id还要大一个xread count 2 streams s1 $
-- 0-0: 表示从最开始的位置获取消息xread count 2 streams 00消费组相关命令
Section titled “消费组相关命令”-- 创建消费者组-- $:表示从stream尾部开始消费-- 0:表示从stream头部开始消费xgroup create stream1 group1 $
xgroup create stream1 group2 0
-- 不同消费组的消费者可以消费同一条消息xreadgroup group group1 consumer1 streams stream1 >
xreadgroup group group2 consumer2 count 1 streams stream1 >
-- 查看每个消费者组内所有消费者(已读取但未确认)的消息-- 查看某个消费者具体读取了哪些数据xpending stream1 group1 - + 10 consumer1
-- 向消息队列确认1607518709271-0消息处理已完成xack stream1 group1 1607518709271-0
-- 查看stream1消息队列的详细信息xinfo stream stream1Bitfield 位域
Section titled “Bitfield 位域”- 将一个redis字符串看作是一个由二进制组成的数组,并能对变长位宽和任意没有字节对齐的指定整形位域进行寻址和修改
set fieldkey hello
get fieldkey
-- 获取0号位h的二进制表示bitfield fieldkey get i8 0
bitfield fieldkey set i8 8 120
bitfield fieldkey incrby u4 2 1