八种数据类型,包括基本类型和特殊类型。
五种基本类型:
string,字符串
hash,哈希
list,列表
set,集合
zset,sorted set,有序集合
三种特殊类型:
- GEO
- BitMap
- hyperLogLog
基础
key
key 是一个 string 类型数据。
key 层级结构:Redis 没有类似 MySQ L中的 Table 的概念,区分不同类型的 key 主要通过 key 的层级区分,例如cache:[项目名]:[业务名]:[类型]:[id]、lock:[项目名]:[业务名]:[类型]:[id]。例如,需要缓存用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,yuzao:user:1 -> {name:"Jack", age:21},yuzao:product:1 -> {name:"cup", price:9.9, color: "white"}。
DEL key # key存在则删除key
UNLINK key
# 作用: 使用UNLINK命令来实现非阻塞删除。与DEL命令不同,UNLINK以非阻塞的方式进行删除操作。当键被删除时,Redis会将键移动到一个专门的异步删除队列中,并在后台异步地释放这些键所占用的内存空间,这样就不会阻塞其他操作。 使用非阻塞删除可以确保在执行删除操作时,不会因为大量的删除操作而导致Redis服务器性能下降或者出现阻塞情况,保证了系统的稳定性和可靠性。
DUMP key # 序列化
TYPE key # 返回key所存储的值的类型
EXISTS key # 检查给定key是否存在
RENAME key newkey # 重命名key
RENAMENX key newkey # newkey不存在时重命名key
MOVE key db # 将key移动到数据库db
RANDOMKEY # 从当前数据库中随机返回一个key
KEYS pattern # 查找所有给定模式的key
EXPIRE key <seconds> # 设定key过期时间,单位为秒
EXPIREAT key <timestamp> # 设定key过期时间,时间戳形式
PEXPIRE key <millionseconds> # 设定key过期时间,单位为毫秒
PERSIST key # 删除key的过期时间,将会持久化,-1
TTL key # 返回key剩余生存时间,单位为秒,TTL, time to live
PTTL key # 返回key剩余生存时间,单位为毫秒
SCAN cursor [MATCH pattern] [COUNT count] # 迭代数据库中的数据库键
string
字符串类型,支持数字字符串的数学运算
| key | value | 备注 |
|---|---|---|
| msg | hello world | 一般字符串 |
| num | 10 | 整数字符串,支持自增和自减操作 |
| price | 9.9 | 浮点字符串,支持自增和自减操作 |
set
# 添加或修改
SET key value [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL] [NX|XX] [GET]
# 添加,若存在则不添加
SETNX key value
# 添加并同时设置过期时间
SETEX key seconds value
PSETEX key milliseconds value
MSET key value [key value ...] # 设置多个值
MSETNX key value [key value ...]
get
GET key # 获取key对应的value,不存在返回nil
GETRANGE key start end
GETEX key [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|PERSIST] # 获取key对应的value返回后删除key-value
MGET key [key ...]
字符串长度
STRLEN key # 获取字符串长度,非字符串报错,无key返回0
字符串拼接
APPEND key value # 在key对应的字符串后拼接value,key不存在则创建空字符串再添加,返回添加后字符串长度
自增、自减
INCR key # 自增,base-10 64 bit signed integer字符串形式,key不存在以0默认自增
INCRBY key increment
INCRBYFLOAT key increment
DECR key
DECRBY key decrement
list
双向链表
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
# 在列表左侧插入若干元素
LPUSH friuts apple banana orange
# 在列表右侧插入若干元素
RPUSH friuts apple banana orange
# 通过索引设置元素
LSET friuts 1 peach
# 移除并返回列表左侧第一个元素,没有则返回 nil
LPOP fruits
# 移除并返回列表右侧第一个元素,没有则返回 nil
RPOP fruits
# 移除并返回列表左侧第一个元素,没有则阻塞等待新元素直至超时
BLPOP fruits timeout
# 移除并返回列表右侧第一个元素,没有则阻塞等待新元素直至超时
BRPOP fruits timeout
# 通过索引获取元素
LINDEX friuts 1
# 返回一段范围内元素
LRANGE key 1 3
# 在列表的元素前或者后插入元素
LINSERT key BEFORE AFTER pivot value
# 将一个值插入到已存在的列表头部
LPUSHX key value
# 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
LTRIM key start stop
# 获取列表长度
LLEN fruits
hash
# 添加或修改 hash 类型 key 的 field 的 value
HSET key field value [field value ...]
# 添加 hash key 的 field 若 field 存在则不操作
HSETNX key field value
# 获取一个 hash 的 field
HGET key field
# 获取所有 hash 的 field
HGETALL key
HDEL key field [field ...]
HEXISTS key field
HMSET
HMGET
HKEYS key # 返回所有key对应的hash中的fieid
HVALS key # 返回所有key对应的hash中的value
HLEN key # 返回key对应的hash中的fieid数量
HSTRLEN key field # 返回key对应的hash中field对应的字符串长度
HINCRBY key field increment
HINCRBYFLOAT key field increment
HRANDFIELD key [count [WITHVALUES]]
HSCAN key cursor [MATCH pattern] [COUNT count]
set
集合
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
| 命令 | 命令格式 | 功能 | 返回值 | 备注 |
|---|---|---|---|---|
| SADD | SADD key item1 item2 item3 | 向集合key中添加若干元素,已存在的元素挥别忽略,若集合不存在会自动创建,若key不为集合则报错 | 整数,实际添加至集合的元素(不包含已有的) | |
| SREM | SREM key item1 item2 item3 | Remove the specified members from the set stored at key. Specified members that are not a member of this set are ignored. If key does not exist, it is treated as an empty set and this command returns 0.An error is returned when the value stored at key is not a set.Removes and returns one or more random members from the set value store at key. |
Integer reply: the number of members that were removed from the set, not including non existing members. | |
| SCARD | SCARD key | 获取集合中的元素个数 | 整数,集合中元素个数,若集合不存在则返回 0 | |
| SISMEMBER | SISMEMBER key member | 判断是否元素在集合中 | 整数,元素在集合中返回1,元素不在集合中返回0,集合不存在返回0 | |
| SMEMBERS | SMEMBERS key | 返回集合中所有元素,与 SINTER key 效果相同 | 数组,集合中所有元素 | |
| SINTER | SINTER key [key1 …] | 获取所有集合的交集 | 数组,结果集合中所有元素 | |
| SDIFF | SDIFF key [key1 …] | 获取第一个集合与其他集合的差集 | 数组,结果集合中所有元素 | |
| SUNION | SUNION key [key1 …] | 获取所有集合的并集 | 数组,结果集合中所有元素 | |
| SMISMEMBER key member [member …] | Returns whether each member is a member of the set stored at key.For every member, 1 is returned if the value is a member of the set, or 0 if the element is not a member of the set or if key does not exist. |
Array reply: list representing the membership of the given elements, in the same order as they are requested. | ||
| SMOVE source destination member | ||||
| SPOP key [count] | ||||
| SRANDMEMBER | SRANDMEMBER key [count] | |||
| SDIFFSTORE | SDIFFSTORE destination key [key …] | |||
| SINTERSTORE destination key [key …] | ||||
| SINTERCARD numkeys key [key …] [LIMIT limit] | ||||
| SUNIONSTORE destination key [key …] | This command is equal to SUNION, but instead of returning the resulting set, it is stored in destination.If destination already exists, it is overwritten. |
Integer reply: the number of elements in the resulting set. | ||
| SSCAN key cursor [MATCH pattern] [COUNT count] | ||||
sorted set
有序集合
- 可排序
- 元素不重复
- 查询速度快
| ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …] | 添加元素 | ||
| ZREM | 删除元素 | ||
| ZSCORE key member | |||
| ZRANK key member | 获取指定元素排名 | ||
| ZCARD key | 获取元素个数 | ||
| ZCOUNT key min max | 获取指定范围内元素个数 | ||
| ZINCRBY key increment member | |||
| ZRANGE key min max | 获取指定排名范围内的元素 | ||
| ZRANGEBYSCORE key min max | 获取指定score范围内的元素 | ||
| ZLEXCOUNT key min max | |||
| ZINTER numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES] | |||
| ZINTERCARD numkeys key [key …] [LIMIT limit] | |||
| ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | |||
| ZUNION numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES] | |||
| ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | |||
geo
Redis中没有专门的GEO数据结构,而是将zset类型作为GEO进行操作
| 命令 | |||
|---|---|---|---|
| GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member …] | |||
| GEOPOS key member [member …] | |||
| GEODIST key member1 member2 [M|KM|FT|MI] | |||
| GEOHASH key member [member …] | |||
| GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius M|KM|FT|MI] [BYBOX width height M|KM|FT|MI] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] | |||
| frommGEOSEARCHSTORE destination source [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius M|KM|FT|MI] [BYBOX width height M|KM|FT|MI] [ASC|DESC] [COUNT count [ANY]] [STOREDIST] |
127.0.0.1:6379> geoadd chian:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 114.08 22.54 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 117.19 39.12 tianjin
(integer) 1
127.0.0.1:6379> keys *
1) "chian:city"
2) "china:city"
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geodist china:city beijing tianjin
"110100.9036"
127.0.0.1:6379> geodist china:city beijing tianjin km
"110.1009"
127.0.0.1:6379> geodist china:city beijing tianjin ft
"361223.4370"
127.0.0.1:6379> geohash china:city beijing
1) "wx4fbxxfke0"
127.0.0.1:6379> geosearch china:city frommember beijing byradius 200 km asc
1) "beijing"
2) "tianjin"
127.0.0.1:6379>
HyperLogLog
基数统计
Redis中没有专门的HyperLogLog数据结构,而是将string类型作为HyperLogLog进行操作
https://blog.csdn.net/weixin_45414689/article/details/119900559
PFADD
PFCOUNT
PFMERGE
127.0.0.1:6379> pfadd hll a b c d e f g h i j
(integer) 1
127.0.0.1:6379> pfcount hll
(integer) 10
127.0.0.1:6379> pfadd hll2 c d e f g h i j k l
(integer) 1
127.0.0.1:6379> pfcount hll2
(integer) 10
127.0.0.1:6379> pfmerge hll3 hll hll2
OK
127.0.0.1:6379> pfcount hll3
(integer) 12
127.0.0.1:6379>
Bitmap,位图
二进制串
位图二进制位从高位到低位,从零开始
Redis中没有专门的位图数据结构,而是将string类型作为位图进行操作
SETBIT key offset value # 向某个位置添加值,若key不存在会创建一个
GETBIT key offset # 获得某个位置的值
BITCOUNT key [start end [BYTE|BIT]]
BITOP # 位操作
BITPOS #
setbit bits 1000 1
getbit bits 1000
getbit bits 0
bitcount bits 0 1000
bitfield
Redis中没有专门的位域数据结构,而是将string类型作为位域进行操作
位域是位图的升级操作,可以在某个范围内进行操作,例如一个字节范围内加减
#
127.0.0.1:6379> BITFIELD mykey SET u8 0 100 INCRBY u8 0 1 GET u8 0
1) (integer) 0
2) (integer) 101
3) (integer) 101
127.0.0.1:6379> setbit bits 128 0
(integer) 0
127.0.0.1:6379> bitfield bits set u8 0 15
1) (integer) 0
127.0.0.1:6379> get bits
"\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
127.0.0.1:6379> bitfield bits set u8 8 15
1) (integer) 0
127.0.0.1:6379> get bits
"\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"