Redis 基本数据类型
Tips:Linux 命令严格区分大小写,redis 命令不区分大小写
redis 键值对中常用的值类型可分为以下几种
目录
1. String 类型
2. Hash 哈希类型
3. List 类型
4. Set 类型
5. 有序集合 Zset
1. String 类型
添加数据
# 添加键值对name:zhangsan 缓存时间:5秒
set name zhangsan ex 5
# 添加键值对name:zhangsan 缓存时间:100毫秒
set name lisi px 100
获取数据
get name
# zhangsan
重复设置 key
# 当没有name这个key时执行该语句
setNx name zhangsan
批量设置 key-value
# 批量设置key-value
mset 001 aaa 002 bbb 003 ccc
# 批量获得 value
mget 001 002 003
# tips: 批量命令不支持Nx,Xx,Ex,Px等参数
删除 key-value
# 格式 del key
del 001
获取 key-value 的剩余生命时间
ttl 001
#return >0: 代表剩余生命周期
#return -1: 代表未设置过期时间
#return -2: 代表键 001 不存在
2. Hash 哈希类型
hash 类型的数据格式为 key: 哈希表,哈希表里面又存了多个键值对key-value,redis采用链表地址法解决哈希冲突,当哈希表中最后一个元素被删除,该键值对也会被redis回收
数据操作方式
# 设置格式: hset key field value
hmset user name zhangsan age 18
# 获取数据格式: hget key field
hget user name # zhangsan
hget user age # 18
判断 value 是否存在
hexists user name
通过 key field 删除哈希表中的某个键值对
# 格式: hdel key field
hdel user name
3. List 类型
redis 中的 List 基于链表实现,插入删除的时间复杂度为O(1),查询时间复杂度为O(n)
数据操作方式
# 将[10 20 30 40 50]按照顺序插入链表头部
lpush score 10 20 30 40 50
# 将[10 20 30 40 50]按照顺序插入链表尾部
rpush score 10 20 30 40 50
获取 value 值,索引从 0 开始
# 格式: lindex key index
lindex score 3
# 格式: lrange key start stop
lrange score 0 2
从头部或者尾部删除链表元素
# 从头部弹出一个元素
lpop score
# 从尾部弹出一个元素
rpop score
删除指定元素
# 格式: lrem key count element
lrem score 0 20
# count==0: 删除所有值为20的元素
# count > 0: 删除从头往尾 count 个值为20的元素
# count < 0: 删除从尾往头 count 个值为20的元素
删除指定索引范围之外的元素,保留索引范围之内的元素
# 格式: ltrim key start stop
ltrim score 0 1
修改链表元素
# 格式: lset key index value
lset score 0 100
# 将 key=score 的第 0 个索引值修改为 100
插入元素
# 格式: linsert key before|after value insert_value
linsert score before 20 90 # 在key=score 值为20的元素前插入一个90
linsert score after 20 80 # 在key=score 值为20的元素后面插入一个80
获取链表长度
#格式: llen key
llen score
4. Set 类型
Set 与 List 的区别:
- Set 集合是自动去重的,当用户把相同的元素插入到 Set 中时,会被自动忽略
- List 基于链表是有序集合,Set 是无序的集合
数据操作方式
添加元素到集合
# 格式: sadd key value1 value2 value3...
sadd age 18 20 22 24 26 zhangsan lisi wangwu
# Set集合中允许添加不同类型的值
获取集合中元素
# 格式: smembers key
smembers set1
查看集合元素个数
# 格式: scard key1
scard set2
判断集合中是否有某个特定元素
# 格式: sismember key value
sismember set1 10
随机获取指定个数元素
# 格式: SRANDMEMBER key [count]
SRANDMEMBER set3 3
# count>0: 随机返回 count 个不重复的元素
# count<0: 随机返回 ads(count) 个允许重复的元素
从集合中移除元素
# 格式: srem key value1 value2...
srem age 18 20
随机的从集合中移除某些元素
# 格式: spop key [count]
spop set3 2
# count必须大于0,小于0将会报错
集合之间的运算
将元素从一个集合移动到另外一个集合
# 格式: smove key1 key2 value
smove set1 set2 10
# 将 set1 集合中的元素 10 移动到集合 set2
计算集合的交集
# 格式: sinter key1 key2 key3...
sinter set1 set2 set3
计算集合的并集
# 格式: sunion key1 key2 key3...
sunion set1 set2 set3
计算集合的差集
# 格式: sdiff key1 key2 key3...
sdiff set1 set2 set3
5. 有序集合 Zset
Zset 集合中每个元素都有一个值和这个值的分数:
- 值以字符串形式存储,分数以64位双精度浮点数存储
- 有序集合中的元素基于其分数大小排序,组成有序集合
- 分数除了数字形式,还有两种字符串表示无穷大 "+inf" 和无穷小 "-inf"
数据操作方式
集合中添加元素
# 格式: zadd key score1 member1 score2 member2...
zadd sort-set 10 u1 20 u2 30 u3
获取指定成员的分数值
#格式: zscore key member
zscore sort-set u1
移除成员
# 格式: zrem key member1 member2...
zrem sort-set u1 u2
增加或者减少成员的分数值
# 格式: zincrby key increment member
zincrby sort-set 30 u1
# 将key=sort-set 的集合中成员u1的分数值+30
# increment=-30 : 将成员u1的分数值-30
获取成员的排名
# 格式: zrank key member
zrank sort-set u3
#降序排名
zrevrank sort-set u3
获取有序排名数据
# 格式: zrange key start end
zrange sort-set 0 2 # 获取分数值从小到大前三名
zrevrange sort-set 0 2 # 获取分数值从大到小前三名
获取指定分数范围内的成员
# 格式: zrangebyscore key minscore maxscore
zrangebyscore sort-set 10 50 # 按照升序获取分数在(10,50)之间的成员
# 格式: zrevrangebyscore key maxscore minscore
zrevrangebyscore sort-set 90 30 # 按照降序获取分数在(30,90)之间的成员
统计指定分数范围内的成员个数
# 格式: zcount sort-set minscore maxscore
zcount sort-set 50 90
# 统计分数在50-90之间(不包括90)的成员个数
zcount sort-set 50 (90
# 统计分数大于50的成员个数
zcount sort-set 50 +inf
# 统计分数小于100的成员个数
zcount sort-set -inf 100