Redis
什么是Redis
- Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化
- redis官网地址:https://redis.io/
- 中文网站 : http://www.redis.cn/
熟悉Redis客户端使用(Redis自带)
1.redis当中对字符串string的操作
- set key value 设置指定 key 的值
- get key 获取指定key的值
- getrange key start end 返回 key 中字符串值的子字符
- getset key value 将给定key的值设为value,并返回key的旧值
- mget key1 [key2…] 获取所有给定(一个或多个)key的值
- setex key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
- setnx key value 只有在 key 不存在时设置 key 的值。
- setrange key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
- setlen key 返回 key 所储存的字符串值的长度。
- mset key value [key value…] 同时设置一个或多个 key-value 对。
- msetnx key value [key value…] 同时设置一个或多个 key-value 对,当且仅当所有给定key都不存在
- psetex key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
- incr key 将key中存储的数字值增一
- incrby key increment 将key所存储的值加上给定的增量值(increment)
- incrbyfloat key increment 将 key所储存的值加上给定的浮点增量值(increment) 。
- decr key 将key中储存的数字值减一。
- decrby key decrement key所储存的值减去给定的减量值(decrement)
- append key value 如果 key已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
redis当中对hash列表的操作
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
- lpush key value1 [value2] 将一个或多个值插入到列表头部
- lrange key start stop 查看list当中所有的数据 : lrange list 0 -1
- lpushx key value 将一个值插入到已存在的列表头部
- rpush key value1 [value2] 在列表中添加一个或多个值
- rpushx key value 为已存在的列表添加值
- linsert key before|after pivot value 在列表的元素前或者后插入元素
- lindex key index 通过索引获取列表中的元素
- lset key index value 通过索引设置列表元素的值
- llen key 获取列表长度
- lpop key 移出并获取列表的第一个元素
- rpop key 移除列表的最后一个元素,返回值为移除的元素。
- blpop key1 [key2] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
- brpop key1 [key2] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
- rpoplpush source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
- brpoplpush source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
- ltrim key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
- del key1 key2 删除指定key的列表
redis当中对hash列表的操作
redis 的 Set 是 String 类型的无序集合。
集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
-
sadd key member1 [member2] 向集合添加一个或多个成员
-
smembers key 返回集合中的所有成员
-
scard key 获取集合的成员数
-
sdiff key1 [key2] 返回给定所有集合的差集
-
sdiffstore destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
-
sismember key member 判断 member 元素是否是集合 key 的成员
-
smovesource destination member 将member元素从source集合移动到destination集合
-
spop key 移除并返回集合中的一个随机元素
-
srandmember key [count] 返回集合中一个或多个随机数
-
srem key member1 [member2] 移除集合中一个或多个成员
-
sunion key1 [key2] 返回所有给定集合的并集
-
sunionstore destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
redis 中对key的操作
- del key 该命令用于在 key 存在时删除 key。
- dump key 序列化给定 key ,并返回被序列化的值。
- exists key 检查给定 key 是否存在。
- expire key seconds 为给定 key 设置过期时间,以秒计。
- pexpire key milliseconds 设置 key 的过期时间以毫秒计。
- keys pattern 查找所有符合给定模式( pattern)的 key 。
- persist key 移除 key 的过期时间,key 将持久保持。
- pttl key 以毫秒为单位返回 key 的剩余的过期时间。
- ttl key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
- randomkey 从当前数据库中随机返回一个 key 。
- rename key newkey 修改 key 的名称
- renamenx key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
- type key 返回 key 所储存的值的类型。
redis java客户端的使用(String,Set,List读写)
-
导入maven坐标
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
-
连接 关闭 客户端
private JedisPool jedisPool; private JedisPoolConfig config; @BeforeTest public void redisConnectionPool(){ config = new JedisPoolConfig(); config.setMaxIdle(10); config.setMaxWaitMillis(3000); config.setMaxTotal(50); config.setMinIdle(5); jedisPool = new JedisPool(config, "node01", 6379); } @AfterTest public void closePool(){ jedisPool.close(); }
搭建Redis单节点模式,主从,哨兵,及集群模式
-
单点模式
- 只在一台机器上进行部署Redis服务,相比其他几种方式做不到HA、Failover,也不能读写分离,也不能对应高吞吐量。一般用于学习时使用。
-
主从复制架构
- 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示。
- 使用主从复制这种模式,实现node01作为主节点,node02与node03作为从节点,并且将node01所有的数据全部都同步到node02与node03服务器
-
Sentinel 哨兵模式
-
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
-
例如:
-
在Server1 掉线后
-
升级Server2 为新的主服务器:
-
-
集群模式
Redis 集群是一个提供在多个Redis节点之间共享数据的程序集。
Redis 集群并不支持同时处理多个键的 Redis 命令,因为这需要在多个节点间移动数据,这样会降低redis集群的性能,在高负载的情况下可能会导致不可预料的错误。
Redis 集群通过分区来提供一定程度的可用性,即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
-
Redis 集群的优势
-
1.缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;
2.迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;
3.Redis可以使用所有机器的内存,变相扩展性能;
4.使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
5.Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;
6.异步处理数据,实现快速读写。
-
Redis集群策略以及设计结构
-
高可用(High Availability),是当一台服务器停止服务后对于业务及用户毫 无影响。 停止服务的原因可能由于网卡、 路由器、机房、CPU负载过高、 内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。
-
主备方式(简单情景) 这种通常是一台主机、一台或多台备机,在正常情况下主机对外提供服务, 并把数据同步到备机,当主机宕机后,备机立刻开始服务。 Redis HA中使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP, 客户端通过虚拟IP进行数据操作,正常期间主机一直对外提供服务, 宕机后VIP自动漂移到备机上。优点是对客户端毫无影响,仍然通过VIP操作。 缺点也很明显,在绝大多数时间内备机是一直没使用,被浪费着的。
-
主从方式(推荐) 这种采取一主多从的办法,主从之间进行数据同步。 当Master宕机后, 通过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务, 主机恢复后以slave的身份重新加入。 主从另一个目的是进行读写分离, 这是当单机读写压力过高的一种通用型解决方案。 其主机的角色只提供写操作或少量的读,把多余读请求通过负载均 衡算法分流到单个或多个slave服务器上。
缺点是主机宕机后, Slave虽然被选举成新Master了, 但对外提供的IP服务地址却发生变化了,意味着会影响到客户端。 解决这种情况需要一些额外的工作,在当主机地址发生变化后及时通知到客户端, 客户端收到新地址后,使用新地址继续发送新请求。
-
主从拓扑
-
Redis的主从拓扑支持单层或者多层结构,可分为一主一从,一主多从,树状主从。
-
一主一从
用于主节点故障转移从节点,当主节点的“写”命令并发高
且需要持久化,可以只在从节点开启AOF(主节点不需要),
这样即保证了数据的安全性,也避免持久化对主节点的影响。 -
一主多从
针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的负担。
-
树状主从
一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点1,再由从节点2推送到11,减轻主节点推送的压力。
Redis的数据同步方式
无论是主备还是主从都牵扯到数据同步的问题,这也分2种情况:同步方式:当主机收到客户端写操作后,以同步方式把数据同步到从机上,当从机也成功写入后,主机才返回给客户端成功,也称数据强一致性。 很显然这种方式性能会降低不少,当从机很多时,可以不用每台都同步,主机同步某一台从机后,从机再把数据分发同步到其他从机上,这样提高主机性能分担同步压力。 在redis中是支持这杨配置的,一台master,一台slave,同时这台salve又作为其他slave的master。
异步方式:主机接收到写操作后,直接返回成功,然后在后台用异步方式把数据同步到从机上。 这种同步性能比较好,但无法保证数据的完整性,比如在异步同步过程中主机突然宕机了,也称这种方式为数据弱一致性。
-