目录
一、Redis简介
1.1 数据结构的操作
1.2 重要概念分析
二、Redis客户端
2.1 简介
2.2 连接
2.3 基本用法
2.4 同步与异步
2.5 消费RedisFuture<T>
2.6 使用消费者监听器
2.7 发布订阅(Pub/Sub)
2.8 事务(Transaction)
2.9 主从复制(Master/Replica)
2.10 集群
三、Spring Data Redis操作
3.1 简介
3.2 配置Lettuce连接
3.3 主写从读模式配置
3.4 Redis哨兵模式(Sentinel)
3.5 发布订阅(Pub/Seb)
3.6 事务(Transaction)
3.7 流水线(Pipelining)
3.8 集群(Cluster)
3.9 序列化与反序列化
四、源码浅析
4.1 RedisTemplate
4.2 Operations类和Commands类
4.3 数据结构
4.4 SessionCallback接口
4.5 RedisCallbacke接口
4.6 总结
五、Spring Boot整合Redis
5.1 pom.xml文件
5.2 spring-boot-autoconfigure配置
5.3 RedisProperties类
5.4 LettuceConnectionConfiguration类
5.5 RedisAutoConfiguration类
六、总结
七、附录 相关网址
一、Redis简介
官方给出的定义是:
- Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
- 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
- Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)
- 提供不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
那么接下来,逐步分析官方给出的定义的重要概念。
1.1 数据结构的操作
下面简单介绍常见命令:
(1)字符串(strings):
- 添加:set key value
- 取值:get key
- (整型)递增: incr key
- (多值)添加:mset key1 val1 key2 val2 key3 val3
- (多值)取值:mget key1 key2 key3
- 修改:set key newVal
- 查询(是否存在):exists key
- 删除:del key
- 查询类型:type key
- (创建值后)设置超时(time时间后将key对应值删除):expire key time
- (创建值时)设置超时:set key val ex time
- 去除超时:persist key
- 查看超时剩余时间:ttl key
(2)散列(hashes):
- 添加多值:hmset yourhash field val [field val ...]
- 添加单值:hset yourhash field val
- 取多值:hmget yourhash field [field ...]
- 取单值:hget yourhash field
- 取全值: hgetall yourhash
- 删除值:hdel yourhash field [field ...]
(3)列表(lists):
- 链表左边添加:lpush list val
- 链表右边添加:rpush list val
- 范围内取值:lrange list index_start index_end
- 截取范围内值:ltrim list index_start index_end
- 添加多值:rpush list val1 val2 val3 val4
- 左边删除:lpop list
- 右边删除: rpop list
- 阻塞式访问左删除:blpop list 或者 blpop list1 list2 list3
- 阻塞式访问右删除:brpop list 或者 brpop list1 list2 list3
- 原子性地返回并移除存储在 list1 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 list2的列表的第一个元素位置(列表头部) : rpoplpush list1 list2
- 阻塞版RPOPLPUSH:brpoplpush list1 list2
(4)集合(sets): String 的无序排列 , 适合用于表示对象间的关系 。
- 添加: sadd myset val1 val2 val3
- 查询元素:smembers myset
- 查询特定元素: sismember myset val
- 删除(随机):spop myset
(5)有序集合(sorted sets):
- 添加(更新):zadd mysortedset score val [score val ...]
- 范围内取值:zrange mysortedset score_begin score_end
- 取索引值:zscore mysortedset val
- 删除索引值最大的值: zpopmax mysortedset
- 删除索引值最小的值: zpopmin mysortedset
(6)bitmaps:不是实际的数据结构,而是一个字符串类型定义的面向比特的集合。
- 添加值:setbit key offset [offset ...]
- 取值:getbit key offset
(7)hyperloglogs:是一种概率的数据结构,用于计算唯一的数据。
- 添加:pfadd key element [element ...]
- 合并: pfmerge key key1 key2
想详细了解可通过点击下面链接:
https://redis.io/commands
1.2 重要概念分析
(1)复制(基于主从结构)
机制:
- 当主从连接正常时,master通过传输命令流来保持slave的数据同步;
- 当主从连接由于网络原因或连接超时出现中断时,slave重新连接并试图部分重新同步(同步中断之后的数据);
- 当部分同步无效后,slave将会申请完全同步。
特性:
- Redis采用异步复制,而主从也是异步地确认需要处理的数据量;
- 一个master可以有多个slave;
- Slave可以连接其他slave;
- 在master处,复制是非阻塞式的;
- 在slave处,大部分复制也是非阻塞式的;
- 复制可以用在实现Redis系统伸缩性,让多个slave负责提供只读查询,也可以用于提高数据安全和系统高可用性。
- 可以使用复制来避免master将全部数据写入磁盘的开销。
(2)事务
保证机制:
- 事务中所有命令都被序列化并会按序执行,并不可打断;
- Readis事物是原子性的,若执行则全部执行,若失败则全部失败。
使用:
- MULTI命令开启事务;
- EXEC命令执行事务。
(3)持久化
持久化方式:
- RDB持久化方式能够在指定的时间间隔进行数据集快照存储;
- AOF持久化方式会记录每一个sever的写操作,当server重启时,将重新执行记录的写操作构建原始数据集;
- 如果只希望数据存在于server运行时,可以不进行持久化;
- 可以结合RDB和AOF进行持久还。
(4)哨兵(Sentinel)
功能:
- 监控(monitoring):Sentinel不断检查master和slave以确保他们按预期运行;
- 提醒(notification):当被监控的Redis出现问题时,将会通过api向用户或者另一个程序发送通知;
- 自动故障转移(automatic failover):当master失效时,Sentinel会开启故障转移处理,将一个slave提升为master,原依附于故障master的slaves将重新配置依附于新的master,并在使用Redis server的应用连接时,告知其使用master的新地址;
- 配置提供者(Configuretion provider):Sentinel充当客户端(clilent)服务发现的根据来源,客户端连接Sentinel,为一个指定的服务请求当前Redis master响应的地址(若发生故障转移,则会向所有连接Sentinel的客户端告知master的新地址)。
(5)分区(Partitioning)
目的:
- 使用多个计算机提供的内存总和来构建更大的数据库(若没有分区,用户将只能使用单台计算机提供的内存量);
- 拓展计算能力到多核和多计算机,将网络带宽拓展到多计算机和多适配器。
方式:
- 客户端分区:客户端直接在正确的节点读取或写入key(大部分客户端已实现);
- 代理分区:客户端向代理端请求数据,由代理端访问正确的节点;
- 查询路由:客户端向一个随机实例请求查询,该实例会将请求转移到正确节点上。