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,系统扫描第一个元素判断超时

posted @ 2021-05-18 19:19  刘66  阅读(66)  评论(0)    收藏  举报