Redis
1 redis简介
- 开源(BSD协议)使用C语言编写,基于内存存储,支持持久化,高性能key-value的NoSQL数据库
- 支持数据结构类型丰富,字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。
- 支持丰富的主流语言的客户端,C ,C++ ,python,Erlang, C# ,R,java,PHP,Go等
- 用途:缓存,数据库,消息中间件
- 官方网站:https://redis.io/
2 Redis-5.0.0
2.1 Redis 安装
第一步:下载安装包并解压
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar -zxvf redis-5.0.0.tar.gz
第二步:下载编译安装的依赖gcc gcc-c++
yum install gcc gcc-c++ -y
第三步:编译安装
cd redis-5.0.0 
make
cp src/redis-server /usr/bin/
cp src/redis-cli /usr/bin/
任意路径下使用命令
cp src/redis-server /usr/bin/ 
cp src/redis-cli /usr/bin/
2.2 redis配置文件参数:
bind 127.0.0.1					#对外提供链接的地址
port 6379					#默认端口号
daemonize no					#守护进程(如果是yes后台运行)
databases 16					#(redis数据库用0,1,2,3....代表)
save 900 1					#每900秒有1次增删改操作就同步到磁盘当中
dbfilename dump.rdb				#rdb备份方式的文件名字(默认开启)
dir ./						#备份文件存放位置
appendonly no					#aof备份是否开启(默认不开启)
appendfilename "appendonly.aof"			#aof备份文件名称
appendfsync everysec				#aof同步机制,每秒同步到磁盘当中
2.3 启动redis
第一步:修改配置文件(守护进程,后台运行释放终端)
╭─root@localhost.localdomain ~/redis-5.0.0  
╰─➤  vim redis.conf 
...
daemonize yes
...
第二步:启动命令:
╭─root@localhost.localdomain ~/redis-5.0.0  
╰─➤ redis-server redis.conf
第三步:连接redis-server
redis-cli -p 6379 -h 127.0.0.1
3 简单操作
切换数据库:
select 2
3.1 字符串
| 作用 | 内容 | 实例 | 
|---|---|---|
| 添加: | set key value | set username balabala | 
| 删除: | del key | del username | 
| 设置过期时间 | set key value EX timeout | setex key timeout value | 
| 查看过期时间 | ttl key | ttl username | 
| 查看当前redis所有的key | keys * | 
3.2 列表
| 作用 | 内容 | 
|---|---|
| 在列表左边添加元素: | lpush key value | 
| 在列表右边添加元素: | rpush key value | 
| 查看列表中的元素: | lrange key start stop | 
| 移除并返回列表key的头元素: | lpop key | 
| 移除并返回列表的尾元素: | rpop key | 
| 指定返回第几个元素: | lindex key index | 
| 获取列表中的元素个数: | llen key | 
| 删除指定的元素: | lrem key count value | 
3.3 集合
| 作用 | 内容 | 实例 | 
|---|---|---|
| 添加元素: | sadd set value1 value2.... | sadd team xiaotuo datuo | 
| 查看元素: | smembeers set | smembers team | 
| 移除元素: | srem set member... | srem team xiaotuo datuo | 
| 查看集合中的元素个数: | scard set | scard team1 | 
| 获取多个集合的交集: | sinter set1 set2 | sinter team1 team2 | 
| 获取多个集合的并集: | sunion set1 set2 | sunion team1 team2 | 
| 获取多个集合的差集: | sdiff set1 set2 | sdiff team1 team2 | 
3.4 哈希
| 作用 | 内容 | 实例 | 
|---|---|---|
| 添加一个新值: | hset key field value | hset website baidu baidu.com | 
| 获取哈希中的field对应的值: | hget key field | hget website baidu | 
| 删除field中的某个field: | hdel key field | hdel website baidu | 
| 获取某个哈希中所有的field和value: | hgetall key | hgetall website | 
| 获取某个哈希中所有的field: | hkeys key | hkeys website | 
| 获取某个哈希中所有的值: | hvals key | hvals website | 
| 判断哈希中是否存在某个field: | hexists key field | hexists website baidu | 
| 获取哈希中总共的键值对: | hlen field | hlen website | 
3.5 事物操作:
Redis事务可以一次执行多个命令,事务具有以下特征:
| 事务 | 内容 | 
|---|---|
| 隔离操作 | 事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。 | 
| 原子操作 | 事务中的命令要么全部被执行,要么全部都不执行。 | 
| 开启一个事务 | multi | 
| 提交事务 | exec | 
| 回滚事务 | discard | 
4 redis高可用架构模式
4.1哨兵模式(Sentinel Mode)
哨兵模式是在主从复制模式的基础上引入的,用于实现自动故障转移和监控机制。哨兵进程会监控主服务器的健康状态,当主服务器不可用时,它会自动将一个从服务器晋升为新的主服务器,并将其他从服务器重新配置为从新的主服务器复制数据。
在实际生产情况中,Redis Sentinel 是集群的高可用的保障,为避免 Sentinel 发生意外,它一般是由 3~5 个节点组成,这样就算挂了个别节点,该集群仍然可以正常运转。

推荐文章:http://c.biancheng.net/redis/sentinel-model.html
4.2集群模式(Cluster Mode)
集群模式是通过将数据分布在多个节点上来实现横向扩展和负载均衡。集群模式将数据按照哈希槽的方式分配到不同的节点上,每个节点负责一部分数据。客户端可以与任意一个节点进行通信,而该节点会负责将请求转发到正确的节点上。
- custer方案主要解决分片问题,即把整个数据按照规则分成多个子集存储在多个不同节点上,每个节点负责整个数据的一部分。
- redis Cluster采用哈希分区规则中的虚拟槽分区。虚认槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定为槽(slot) ,槽的范围是0 ~ 16383(共2的14次方个)。
- Redis Cluster中槽是集群内数据管理和迁移的基本单位,采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。
- redis Cluster准备了一个超大的数组记录哪个槽由哪个节点负责,实时更新,数据访问的时候可以快速定位存储数据的节点。
- Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映时到0 ~ 16383,计算公式: slot= CRC16(key)&16383、每一个节点负责维护一部分槽以及槽所映射的键值教据。
- 集群之间的信息通过 Gossip协议 进行交互,这样就可以在某一节点记录其他节点的哈希槽(slots)的分配情况。
下图展现一个五个节点构成的集群,每个节点平均大约负责3276个槽,以及通过计算公式映射到对应节点的对应槽的过程。

集群主从模式:


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号