Redis 是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的 Web 应用程序。Redis 也被作者戏称为数据结构服务器 ,这意味着使用者可以通过一些命令,基于带有 TCP 套接字的简单服务器-客户端协议来访问一组可变数据结构 。
Redis是什么?
-
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
1、Redis安装在磁盘
2、Redis数据存储在内存。
-
Redis解决什么问题
先从Redis缓存查询数据,如果没有则到MySQL中查
-
Redis特性
-
速度快
-
键值对数据结构服务器
-
丰富的功能
-
简单稳定 --- 单线程
-
持久化
-
高可用、分布式转移
-
客户端语言多
-
-
Redis使用场景
-
缓存数据库
-
排行榜
-
计数器应用
-
社交网络
-
消息队列
-
其他场景
-
Redis数据类型?
String
-
String
类型 (实际上可以是字符串(包括XML JSON
),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB)set age 18 (18) incr age (19) decr age (18) incrby age 2 (20) decrby age 2 (18)
-
批量设值
mset
mset name Rick age 20
批量设置,可减少IO进而提高效率
-
设置过期时间
set age 23 ex 10 // 10s后过期 px 10000ms过期
-
常用用法
set name Rick append name Kay get name (RickKay)
-
String应用场景
-
计数器
INCR article:readcount:{文章id} // 统计某文章的阅读量,用户进来点一次进行加1 GET article:readcount:{文章id} // 获得某文章的阅读量
INCR article:readcount:1001 INCR article:readcount:1001 INCR article:readcount:1001 INCR article:readcount:1001 GET article:readcount:1001 (4)
-
Web集群session共享
Spring session + redis实现session共享
-
分布式系统全局序列号
-
Hash
-
Hash 哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象
存储一个用户(user)信息:1主键
hset
hset user:1 name Rick age 20 hgetall user:1 ("name" "Rick" "age" "20") hget user:1 age ("20")
hmset
hmset user:2 name Kay age 20 sex male hmget user:2 name age sex ("Kay" "20" "male") hgetall user:2 ("name" "Kay" "age" "18" "sex" "male") hvals user:2 ("Kay" "18" "male")
-
三种方式存储用户信息的优缺点
-
原生:
set user:1:name james
set user:1:age 23
set user:1:sex boy
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境
-
将对象序列化存入Redis
set user:1 serialize(userInfo)
优点: 编程简单
缺点:序列化和反序列化有开销
-
使用Hash类型
优点:简单直观,使用合理可减少内存空间消耗
缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize
-
-
应用场景
-
电商购物车
以用户id为key;商品id为filed;商品数量为value
例如用户1001的购物车的相关操作:
添加商品 --->
hset cart:1001 10088 1
增加数量 --->
hincrby cart:1001 10088 1
商品总数 --->
hlen cart:1001
删除商品 --->
hdel cart:1001 10088
获取购物车所有商品 --->
hgetall cart:1001
-
List
-
rpush
和lpush
rpush
:在list
的尾部追加元素lpush
:在list
的头部追加元素lrange key start stop
:返回列表key
中指定区间内的元素,区间以偏移量start
和stop
指定rpush str a b c lrange str 0 -1 ("a" "b" "c") lpush str1 a b c lrange str1 0 -1 ("c" "b" "a")
-
因为有序,可以通过索引下标获取元素或某个范围内元素列表
llen
获取当前列表长度
lpop
把左边第一个元素删掉
rpop
把右边第一个元素删掉llen str (3) lpop str (a) rpop str (c)
-
应用场景
-
Stack : LPUSH + LPOP ==> FILO
-
Queue:LPUSH+ RPOP
-
Blocking MQ : LPUSH + BRPOP
-
微博和微信公众号消息流
公众号A发微博,消息id为10018
LPUSH msg:1001 10018
公众号B发微博,消息id为10086
LPUSH msg:1001 10086
查看最新微博消息
LRANGE msg:rick 0 5
-
Set
sadd sinter
(求交集)
保存多元素,与列表不一样的是不允许有重复元素,且集合是无序
sadd user a b c (3)
sadd user a (0)
-
集合使用场景:
-
微博微信点赞
sadd like:{消息id} {用户id}
==> 点赞srem like:{消息id} {用户id}
==> 取消点赞sismember like:{消息id} {用户id}
==> 检查用户是否点赞smembers like:{消息id}
==> 获取点赞的用户列表scard like:{消息id}
==> 获取点赞用户数 -
微信小程序抽奖
sadd key {userID}
==> 点击参与抽奖smembers key
==> 查看参与抽奖所有用户srandmember key[count](抽完后不剔除) / SPOP key [count](抽完后剔除)
==> 抽取count
名中奖者 -
集合操作实现微博微信关注模型
A关注的人:ASet: {B,C,D}
B关注的人:BSet: {A,C,D,E}
C关注的人:CSet: {A,B,E,F}
A和B的共同关注(求交集):
SINTER ASet BSet
==> {C,D}A关注的人也关注B(列举出A关注的人是否关注B):
sismember CSet B sismember DSet B
A可能认识的人(差集):
sidff ASet BSet
-
Zset
有序集合,常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
zadd zan 100 Rick
zadd zan 200 kay
zadd zan 150 Lee
zrange zan 0 -1 withscores ("Rick" "100" "Lee" "150" "kay" "200")