redis的数据类型及应用
redis五大数据类型:string、hash、list、set、sorted_set
1、String类型
1.1、基本操作
| 命令 | 作用 |
|---|---|
| set key value | 添加 / 修改数据 |
| get key | 获取数据 |
| del key | 删除数据 |
| mset key value key1 value1... | 添加 / 修改多个数据 |
| mget key key1... | 获取多个数据 |
| append key value | 追加信息到原始数据后边,数据不存在时则添加 |
1.2、增减操作
原子操作
设置数值增加指定范围的值:
incr key 默认每次加1
incrby key value 每次新增value
设置数据减少指定范围:
decr key 默认每次减1
decrby key value 每次减少value
应用:
1、控制数据库表主键id,为数据库表提供主键生成策略,保证数据表主键的一致性。
2、计数器
1.3、时效操作
设置过期时间:setex key seconds value
应用:
1、实现限制时间投票功能:例如一个微信一个小时可以投一次
2、实现热点信息:例如电商行业热门商品、新闻网站热门新闻
1.4、String类型的应用场景
处理高频信息,例如微博大V主页高频的访问,对于粉丝数、关注数、微博数都需要时时更新。
在redis中为大V设定用户信息,以用户主键和属性为键值,以下为实现案例。
local> set user:id:12:fans 998
ok
local> set user:id:12:blogs 9527
ok
local> set user:id:12:focuss 196
ok
local>
key的命名规则:以表名+主键+主键值+字段 :字段值
或者用结构数据
local> set user:id:12 {fans:998,blogs:9527,focuss:196}
ok
local>
第一种可以很方便的对任意一个值进行管理,第二种是改一个都得改一次,看业务场景,定时刷新就行。
2、hash类型
数据类似map的键值对存储,key的值可看成map的名称,map的键是field,value是对应的值
2.1、 基本操作
| 命令 | 作用 |
|---|---|
| hset key field value | 添加 / 修改数据 |
| hget key field | hgetall key | 获取数据 |
| hdel key field field1 | 删除数据 |
| hmset key field value field1 value1 | 添加 / 修改多个数据 |
| hmget key field field1 | 获取多个数据 |
| hlen key | 获取表中字段数量 |
| hexists key field | 获取表中是否存在某个字段 |
2.2、扩展操作
获取hash表中所有的字段值:hkeys key
获取hash表中所有的字段值:hvals key
设置指定字段的数值增加指定范围的值:hincrby key field increment | hincrbyfloat key field increment
2.3、应用场景
简单模拟购物车场景
key的值表示xxx的购物车
key值结构:表名+主键+主键值
map结构: 商品数量、商品信息
local> hmset user:id:12 good_num 8 good_info {title:kaka,price:196}
ok
local> hgetall user:id:12
good_num
8
good_info
{title:kaka,price:196}
local>
我们会有一个问题就是商品信息存储会大量重复,我们可以将商品单独给一直hash。如下只存储商品id
local> hset user:id:12 good_num 8 good_info 12
ok
local> hgetall user:id:12
good_num
8
good_info
12
商品信息
两种方式 : 多字段 或 json
local> hset good:id:12 title kaka price 12
ok
local> hgetall good:id:12
title
kaka
price
12
local> hset good:id:12 info {title:kaka,price:12}
ok
local> hgetall good:id:12
title
kaka
price
12
{title:kaka,price:12}
local>
不同的用户添加同样的商品时不执行覆盖和无用操作,可以使用 hsetnx key field value 如果有则不进行添加,没有则添加
local> hsetnx good:id:12 info {666:666}
0
local> hsetnx good:id:13 info {666:666}
1
local> hgetall good:id:12
title
kaka
price
12
{title:kaka,price:12}
local> hgetall good:id:13
info
{666:666}
local>
3、list类型
list类型,底层使用双向链表存储结构实现。用于存储多个数据、数据有序
3.1、基本操作
lpush key value value1 : 将一个或多个值插入到列表头部
rpush key value value1 : 将一个或多个值插入到列表的尾部(最右边)
lrange key start end :返回列表中指定区间内的元素
lindex key index :通过索引获取列表中的元素
llen key :返回列表的长度
rpop key :移除并返回列表的最后一个元素
lpop key : 移除并返回列表的第一个元素
local> lpush list1 a b c d
4
local> rpush list1 a b c d
8
local> lrange list1c 0 -1
d
c
b
a
a
b
c
d
local>
3.2、扩展操作
blpop key1 key2 timeout :移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
brpop key1 key2 timeout :移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
lrem key count value :根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
- count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值
- count = 0 : 移除表中所有与 VALUE 相等的值
3.3、应用场景
朋友圈点赞业务,然后从中间取消数据。
模拟:先往list1里边添加 a b c d,然后移除c
local> rpush list1 a b c d
4
local> lrange list1 0 -1
a
b
c
d
local> lrem list1 0 c
1
local> lrange list1 0 -1
a
b
d
local>
4、set类型
String 类型的无序集合,不允许重复值 。数据结构与hash相同,filed存值 对应value无值(nil)
能够保存大量的数据,便于查询
4.1、基本操作
添加 / 修改数据:sadd key member member1
获取数据:smembers key
删除数据:srem key member1
获取集合数据总量:scard key
判断集合中是否包含指定数据:sismember key member
local> sadd set1 k1 k2 k3 k4
4
local> smembers set1
k4
k3
k2
k1
local> srem set1 k1
1
local> smembers set1
k3
k2
k1
local> scard set1
3
local> sismember set1 k1
0
local>
4.2、扩展操作
随机获取集合中指定数量的数据:srandmember key count
移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素:spop key
4.3、应用场景
4.3.1、热点关注推荐
随机推送热点信息、热点新闻、热卖旅游、应用app推荐、关注推荐等
案例一:根据一定的推荐机制往set里边存放对应的用户,然后每次进行随机获取2位需要推荐的用户
local> sadd focus 001 002 003 004 005 006
6
local> smembers focus
002
004
003
001
005
006
local> srandmember focus 2
002
001
local> srandmember focus 2
002
003
local> srandmember focus 2
004
001
local>
案例二:根据一定的推荐机制往set里边存放对应的用户,然后根据日期每天推荐的用户都不能重复
local> spop focus 2
006
002
local> spop focus 2
001
004
local> spop focus 2
003
005
local> spop focus 2
local>
4.3.2、掘用户关系
集合操作
sinter key key1 交
sunion key key1 并
sdiff key key1 第一个集合中独有的元素
sinterstore destination key1 key2 返回交集并存储到指定集合中
sunionstore destination key1 key2 返回并集并存储到指定集合中
sdiffstore destination key1 key2 返回第一个集合中独有的元素并存储到指定集合中
示例
local> sadd u1 1 2 3
3
local> sadd u2 2 4
2
local> sinter u1 u2
2
local> sunion u1 u2
1
2
3
4
local> sdiff u1 u2
1
3
local> sdiff u2 u1
4
local> sinterstore u3 u1 u2
1
local> smember u3
2
local>
可以用使用差集来实现共同好友
微信公众号的共同关注好友数量
QQ添加新好友的推荐机制
深度挖掘用户直接的联系
4.3.3、实现网站的PV UV IP的记录
PV:浏览量或点击量
UV:独立访客数
PV直接使用string类型的incr统计即可
UV和IP都是独立不重复的,使用set来操作。
在上边我们知道set有一个特性就是不能重复,我们就可以根据这一点来轻松实现这个功能。然后使用scard key 来统计数量。
至于UV是独立访客,使用本地的cookie来实现就可以,方法一样把cookie传给redis做记录即可
local> sadd ip 127.0.0.1
1
local> sadd ip 127.0.0.2
1
local> sadd ip 127.0.0.2
0
local> scard ip
2
5、sorted_set(zset)类型
支持排序功能
5.1、基本操作
添加数据:zadd key score member
获取数据:zrange key start stop | zrevrange key start stop
删除数据:zrem key member
local> zadd score 10 k
1
local> zadd score 20 k1
1
local> zadd score 30 k2
1
local> zrange score 0 -1
k
k1
k2
local> zrange score 0 -1 withscores
k
10
k1
20
k2
30
local> zrevrange score 0 -1 withscores
30
k2
20
k1
10
k
5.2、扩展操作
按条件获取数据:zrangebyscore key min max limit | zrevrangescore key max min
条件删除数据:zremrangebyrank key start stop | zremrangebyscore key min max
获取集合数据总量:zcard key | zcount key min max
集合交、并操作:zinterstore destination numkeys key | zunionstore destination numkeys key
获取数据对应的索引:zrank key member | zrevrank key member
socre值获取与修改:zscore key member | zincrby key increment member
5.3、应用场景
订单超时处理,作为延迟队列
将订单超时时间戳与订单号分别设置为score与member,系统扫描第一个元素判断超时

浙公网安备 33010602011771号