今天聊聊Redis

持久、高效的缓存软件

Posted by     BY   杨晓明 on September 15, 2017

一、Redis简介

1.什么是Redis

Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
目前多数的NoSql数据库本质上都是键值对形式,Redis也不例外。作为缓存数据库的一种,和Memcached相比,有以下几种主要的优点:

  1. 速度上,Redis要比Memcached快,这是基于一些Benchmarks的测试结果得出的,而且在内存使用上,Redis突破了物理内存限制,可以使用虚拟内存;
  2. 数据类型比Memcached要多,Redis支持List、Set、SortedSet、HashMap等多种数据结构;
  3. 持久化方面,Memcached没有相应的持久化机制,而Redis有RDB快照和AOF日志两种形式结合做持久化,很大限度上保证了数据的持久化和安全性, 作者:Salvatore Sanfilippo ,作者的GitHub 看一下作者照片,很明显牛人的特质:

    2.特点

  4. 速度快
  5. 支持多种数据结构(string、list、hash、set、storted set)
  6. 持久化
  7. 主从复制(集群)
  8. 支持过期时间
  9. 支持事务
  10. 消息订阅

二、安装配置与基本特性

1.安装

1.1 下载地址
官网:http://www.redis.io/download
中文官网:http://www.redis.cn/download.html
guthub:https://github.com/ServiceStack

1.2 编译安装

wget http://download.redis.io/releases/redis-3.2.6.tar.gz
tar xzf redis-3.2.6.tar.gz
cd redis-3.2.6
make

1.3 后台运行
对daemonize项参数进行修改,设置为yes: daemonize nyes 1.4 启动测试

#启动Redis
./src/redis-server  ./redis.conf
#关闭
./src/redis -cli shutdown
#简单测试
./src/redis-cli
redis> set name xmy
OK
redis> get name
"xmy"

2.配置文件

主目录下redis.conf

参数 说明
daemonize no/yes 前台运行/后台运行
port 6379 端口
appendonly no/yes 日志关/开
logfile stdout -> ./logs/redis.log 日志文件
dbfilename dump.rdb 持久化数据文件

此处关于默认6379端口有个有趣的小故事,详情可以查看这篇博客

3.登录Redis

redis-cli [OPTIONS] [cmd [arg [arg …]]]
-h Server hostname (default: 127.0.0.1). -p Server port (default: 6379). 单实例启动:redis-cli启动即可 多实例启动:redis-cli -p port config-path,后接端口+配置文件路径

4.保护模式

Redis 3.2新特性,解决访问安全。
配置方法很简单,只需在redis.conf中加入一个参数:requirepass yourpassword 登录redis命令行时首先执行:auth {password}即可登录redis.

5.持久化

在聊持久化之前,先看一下Redis的数据存储:
redis数据存储 Redis作为一款纯内存软件,通过持久化保证数据的安全性。其工作方式如下:

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
  • AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。 你甚至可以关闭持久化功能,让数据只在服务器运行时存在。
  • 持久化策略: 日志文件 appendonly yes/no save 900 1 save 300 10 save 60 10000 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改,即将数据写入硬盘。

6.压缩

dbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

7.同步

appendfsync no/always/everysec no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)

三、Redis数据结构

1.Redis基础命令

命令 操作
Info 显示CPU等信息
client list 显示所有客户端
client kill ip:port 杀死某个客户端
config get * 显示所有配置
CONFIG RESETSTAT 重置统计
CONFIG GET/SET 动态修改
dbsize 放回当前数据库key的数量
FLUSHALL 清空所有数据
FLUSHDB 清空当前库
MONITOR 监控实时指令
KEYS * 查看KEY支持通配符(慢查询)
DEL 删除给定的一个或多个key
EXISTS key 检查key是否存在
EXPIRE key 设定key生存时间
TTL key 以秒为单位返回过期时间
DUMP RESTORE 序例化与反序列化
PEXIRE PTTL PERSIST 以毫秒为单位
RENAME 变更KEY名
SORT 键值排序
TYPE 返回键所存储值的类型

2.Redis的数据结构

Redis的数据结构

1).字符串

一个键最大能存储512MB

字符串相关方法

命令 操作
set name “xmy” 创建键值对
get name 获key name键的值
append 将value追加到key原来的值的末尾
mset 同时设置一个或多个键值对
mget 同时查看一个或多个键值对
strlen 返回字符串长度
incr 将值增1
decr 将值减1
incrby 增加指定量
decrby 减去指定量

2).Hash(哈希)

每个 hash 可以存储 2^32 -1 键值对 Redis hash 是一个键值对集合。(Python字典) Redis hash是一个string类型的field和value的映射表 hash特别适合用于存储对象

哈希相关方法

命令 操作
hset 创建单个键值对放入哈希表
hget 获取哈希表中单个键的值
hmset 创建多个键值对放入哈希表
hmget 获取哈希表中多个键的值
hgetall 返回哈希表的所有键值
hkeys/hvals 获取所有字段键/值
hdel 删除key中的一个或多个指定域

5). List列表

Redis列表是简单的字符串列表。按照插入顺序排序每个LIST可以存储 2^32 -1 键值对。

列表相关方法

命令 操作
LPUSH 将一个或多个值插入到列表头部
RPUSH 将一个或多个值插入到列表尾部
llen key 返回列表key的长度
lrange min max  返回指定下标区间的元素
lindex 返回列表 key 中下标为 index 的元素
lset key index value 将列表 key 下标为 index 的元素的值设置为 value
linset 插入数据位于某元素之前或之后
lrem greet 2 morning 删除前两个morning
lrem greet -1 morning 删除后一个morning
LPOP/RPOP 移除表头/尾的元素
lrem greet 0 hello 删除所有hello

6).set集合

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的。

集合相关方法

命令 操作
sadd key member [member …] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
scard key 返回集合KEY的元素的个数
smembers key 返回所有元素
sismember member 判断元素是否属于该集合
sdiff key1 key2 返回一个集合的全部成员,该集合是所有给定集合之间的差集,注意前后顺序。比较后Sdiffstore进行存储
sunion 返回一个集合的全部成员,该集合是所有给定集合的并集。SUNIONSTORE
sinter key [key …] 返回一个集合的全部成员,该集合是所有给定集合的交集。SINTERSTORE
smove source destination member 将 member 元素从 source 集合移动到 destination 集合.
spop srandmember 移出或读取一个随机元素。
srem member 移除集合中一个或多个元素

7).SortedSet(有序集合)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

有序集合相关方法

命令 操作
zadd key score member 创建一个带分数的元素
zcard key 返回有序集key的元素个数
zscore key member 返回指定元素的分数
zcount key min max 计算min到max之间的分数对应的元素个数
zincrby key increment member 为score 值加上增量increment,负数为减法
zrange key start stop 返回指定下标区间的元素
zrange key 0 -1 WITHSCORES 显示所有元素+分数
ZRANGEBYSCORE key min max 有序集成员按分数值递增次序排列
ZRANK key member 显示元素的排名
ZREM key member 移除一个或多个元素
ZREVRANGE key start stop [WITHSCORES] 指定下标区间递减返回元素

四、高级应用

1.Redisf发布-订阅模式

发布消息通常有两种模式:队列模式(queuing)发布-订阅模式(publish-subscribe)。队列模式中,consumers可以同时从服务端读取消息,每个消息只被其中一个consumer读到。

发布-订阅模式中消息被广播到所有的consumer中,topic中的消息将被分发到组中的一个成员中。同一组中的consumer可以在不同的程序中,也可以在不同的机器上。

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。如下图所示: 发送消息

Redis订阅-发布方法:

命令 操作
PSUBSCRIBE 订阅一个或多个符合给定模式的频道。
PUBLISH channel message 将信息 message 发送到指定的频道 channel 。返回值代表消费者数量
pubsub channels 显示订阅频道
PUBSUB NUMSUB news.it 打印各频道订阅者数量
PUNSUBSCRIBE 退订多个频道
SUBSCRIBE 订阅给定的一个或多个频道的信息。
UNSUBSCRIBE 退订频道

2.Redis事务

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 在redis的事务中,着重表示原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。这样保证某些操作的确定性,例如转账操作。

事务的执行过程:

  1. 开始事务
  2. 命令入队
  3. 执行事务

事务的方法:

命令 操作
EXEC 执行所有事务块内的命令
MULTI 标记一个事务块的开始
DISCARD 取消事务,放弃执行事务块内的所有命令
WATCH key [key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
UNWATCH 取消 WATCH 命令对所有 key 的监视

待续…..

五、Redis主从复制与高可用

六、Redis Sentinel

七、Redis Cluster

八、Redis API