小知识(2) Redis数据结构及使用场景

一、前言

Redis数据结构及使用场景举例。

二、Redis数据结构

基本数据类型

1、字符串(String)

使用场景:存储用户信息、点赞计数等

# 设置值
set key value
# 获取值
get key
# 删除指
del key
# 设置值和过期时间
setex key seconds value
# 查询过期时间 -1:永不过期 -2:已过期-即key不存在
ttl key
#  批量设置值
mset name zq age 18
# 批量获取值
mget name age
# 将key中储存的数字值增1(key不存在,则初始化为0,再加1),并返回结果值
incr key
# 将key中储存的数字值减1(key不存在,则初始化为0,再减1),并返回结果值
decr key
# 指定自增多少
incrby key 10
# 指定自减多少
decrby key 10
2、列表(List) - 链表,有序,可重复

使用场景:数据字典

  1. key -> 字典code
  2. value -> 字典值
# 将值插入到key的表头(最左边)
lpush mylist 1 2 3 4 five
# 将值插入到key的表尾(最右边)
rpush mylist 6 7 8
# 查看元素
lrange mylist 0 -1
# 移除头(最左边)元素
lpop mylist
# 移除尾(最右边)元素
rpop mylist
#  根据count值移除列表key中与参数 value 相等的元素
#           count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
#           count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
#           count = 0 : 移除表中所有与 value 相等的值。
lrem key count value
# 返回列表 key 中,下标为 index 的元素
lindex key index
# 对一个列表进行截取数据,保留下标从start到stop间的数据
ltrim key start stop
3、集合(Set) - 无序,不重复

使用场景:文章关联用户点赞、浏览信息

# 添加元素到集合
sadd my_set_a 1 2 3 4 five
# 查看集合元素  => ex: 查看关注/点赞列表
smembers my_set_a
# 判断集合是否包含指定value 包含返回1 不包含返回0
sismember my_set_a five
# 移除集合key中的元素
srem my_set_a 3
# 查看元素个数
scard my_set_a

sadd my_set_b 2 3 6
# 求2个集合的差集
sdiff my_set_a my_set_b
# 求2个集合的交集  => ex: 共同关注
sinter my_set_a my_set_b

在这里插入图片描述

4、有序集合(Zset)

使用场景:排行榜

# 添加元素到集合
zadd myscore_set 100 aa 90 bb 80 cc 70 dd 60 ee 50 ff
# 查看指定元素
zscore myscore_set aa
# 查看所有元素 - 根据score正序排序,withscores:score值一起输出
zrange myscore_set 0 -1
zrange myscore_set 0 -1 withscores
# 查看前3个元素 - 根据score倒序排序
zrevrange myscore_set 0 3
zrevrange myscore_set 0 3 withscores

# 根据score查询100-0之间的数据,偏移量为0(即从100-0之间数据的第一个元素开始查),每页查询3条数据
zrevrangebyscore myscore_set 100 0 withscores limit 0 3

在这里插入图片描述

5、哈希(Hash) - 键值对结构

使用场景:购物车redis存储设计

  1. key -> 租户ID+用户ID
  2. field -> 商品规格属性SKU-ID
  3. value -> 商品信息
# 添加一个name=>value键值对到key这个hash类型    hset userinfo name zq age 18
hset key name value
# 批量添加name=>value键值对到key这个hash类型   hmset userinfo name zq age 18
hmset key name1 key1 name2 key2
# 获取hash类型的name键对应的值
hget key name
# 批量获取hash类型的键对应的值
hmget key name1 name2
del userinfo
# 返回哈希表 key 中,所有的键和值
hgetall userinfo
# 返回哈希表 key 中的所有键
hkeys
# 返回哈希表 key 中的所有值
hvals

其它数据类型

1、GEO:地理信息定位,使用有序集合实现

使用场景:求最近的附近人

# 添加地理位置的坐标
geoadd geo_chengdu 104.07477 30.56076 "世纪城" 104.07520 30.55262 "天府三街" 104.07547 30.54295 "天府五街"
# 获取地理位置的坐标
geopos geo_chengdu "天府三街" "天府五街"
# 计算两个位置之间的距离 单位:km
geodist geo_chengdu "天府三街" "天府五街" km
# [6.2版本之后弃用] 根据用户给定的经纬度坐标(这里是天府三街坐标)来获取指定范围内的地理位置集合
georadius geo_chengdu 104.07515 30.55260 1.5 km
# [6.2版本之后弃用] 根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合
georadiusbymember geo_chengdu "天府三街" 1 km

# [6.2版本新增] 根据经纬度(这里是天府三街坐标)搜索半径2km以内的
geosearch geo_chengdu fromlonlat 104.07515 30.55260 byradius 2 km withdist
# 返回一个或多个位置对象的 geohash 值
geohash geo_chengdu "天府三街" "天府五街"

在这里插入图片描述

2、BitMap:位图,本质是string

使用场景:用户在线状态、统计活跃用户、用户周活跃、用户签到

# 设置zq第1天 签到->1
setbit zq 0 1
# 设置zq第2天 签到->1
setbit zq 1 1
# 设置zq第3天 签到->1
setbit zq 2 1
# 设置zq第9天 未签到->0
setbit zq 8 0
# 设置zq第15天 签到->1
setbit zq 16 1
# 查询第9天是否签到
getbit zq 8
# 查看zq总签到天数
bitcount zq

在这里插入图片描述

3、HyperLogLog:基数统计,超小内存唯一值计数,本质是string

使用场景:计算日活、7日活、月活数据

# 添加任意元素,有变化返回1,无变化返回0
pfadd ip_zq1 "192.168.0.1" "192.168.0.2" "192.168.0.3"
pfadd ip_zq2 "192.168.0.1" "192.168.0.2" "192.168.0.5"
# 查看元素个数
pfcount ip_zq1
# 查看元素总的不重复个数
pfcount ip_zq1 ip_zq2
# 合并ip_zq1和ip_zq2到ip_zq3中
pfmerge ip_zq3 ip_zq1 ip_zq2

今日分享语句:
鸡蛋,从外打破是食物,从内打破是生命,人生也是如此,从外打破是压力,从内打破是成长。

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/127489476