Redis笔记整理(二)
个人印象笔记地址:https://app.yinxiang.com/fx/2e66f551-c06f-4ec5-b4bb-fd1c32073218
redis的数据结构 :
-
String: 字符串
-
Hash: 散列
-
List: 列表
-
Set: 集合
-
Sorted Set: 有序集合
Redis运行在内存中但是可以持久化到磁盘
一·String类型:
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
二·redis哈希Hash类型:
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
三:List类型
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
四:Set 类型:
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
常用指令:
1.SADD key member1 [member2] 向集合添加一个或多个成员
2. LRANGE key start stop : 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定, 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素.超出范围的下标值不会引起错误。 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。
如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。
五:scorted set有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
总结:
Redis 发布订阅(pub/sub)是一种消息通信模式:
发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系
简单实现:
1.在xshell中打开会话窗口1,假设窗口1为发布者,右键复制会话窗口234.
2.各个窗口都先执行订阅指令:SUBSCRIBE CCTV5(频道号)
3.然后会话窗口1作为发布者。执行publish CCTV5(频道号)
4.之后三个订阅窗口会自动显示订阅消息:
查看活跃的订阅账号语句:PUBSUB CHANNELS
Redis 发布订阅命令
下表给出常用的发布订阅命令
Redis的事务机制:
1.什么是事务
事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
比如微博中: A用户关注了B用户,那么A的关注人列表里面就会有B用户,B的粉丝列表
里面就会有A用户。
这个关注与被关注的过程是由一系列操作步骤构成:
(1) A用户添加到B的粉丝列表里面
(2) B用户添加到A的关注列表里面;
这两个步骤必须全部执行成功,整个逻辑才是正确的,否则就会产生数据的错误,比如A
用户的关注列表有B用户,但B的粉丝列表里没有A用户:
要保证一系列的操作都完全成功,提出了事务控制的概念。
Redis中的事务(ransaction) 是一组命令的集合, 至少是两个或两个以上的命令,redis事
务保证这些命令被执行时中间不会被任何其他操作打断。
2.主要的事务:
DISCARD---->rollback回滚
取消事务,放弃执行事务块内的所有命令。
EXEC-------->commit提交
执行所有事务块内的命令。
假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。
MULTI----->beginTransaction开启事务
标记一个事务块的开始。
UNWATCH
因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。
redis的使用场景
-
缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;
-
排行榜,在使用传统的关系型数据库(mysql oracle 等)来做这个事儿,非常的麻烦,而利用Redis的SortSet(有序集合)数据结构能够简单的搞定;
-
计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
-
好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;
-
简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;
-
Session共享,以PHP为例,默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。
-
一些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很大,而放在redis中,因为redis 是放在内存中的可以很高效的访问
使用redis的理由:
完全基于内存所以速度很快,使用C语言实现,网络层使用epoll解决高并发问题,单线程模型避免了不必要的上下文切换及竞争条件; 注意:单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,在持久化时它就会重开一个线程/进程去进行处理
丰富的数据类型,Redis有8种数据类型,常用的有 String、Hash、List、Set、 SortSet 这5种,都是基于键值的方式组织数据。每一种数据类型提供了非常丰富的操作命令,可以满足绝大部分需求
jedis 数据库连接池:
Spring Data Redis (推荐)
Spring-data-redis是spring大家族的一部分, 提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,
JRedis, and RJC)进行了高度封装,RedisTemplate提供 了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1
cache进行了实现。
spring-data-redis针对jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的"Redis Template'"类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations: set类型数据操作
ZSetOperations: zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类 型的数据操作
Spring Data Redis与Jedis的选择
Redis的客户端有两种实现方式,-是可以直接调用Jedis来实现, 二是可以使用Spring Data Redis,通过Spring的封装来调
用。应该使用哪一个呢? 基于当前版本Spring Data Redis和Jedis,
分析如下:
●Spring Data Redis优点
1.对具体Redis客户端做了封装,客户端可在Jdis, Jredis, Rjc等 Java客户端中做出选择和切换。
2.用template对调用做了封装,省去了建立连接,释放连接等繁琐代码。
3、对对象的序列化也可自由选择工具。
4.提供对Spring Cache的支持,可用注解实现Cache,但是无法设定缓存失效时间。
●Jedis 优点
1、可用到Jedis本身提供的更多的特性,比如Sharded, 比如Masater/Slaver.