1. 简介
一、Redis简介
Redis (Remote Dictionary Server)是用C语言编写的开源数据库,可以将数据放入内存,也可以持久化到磁盘
Redis不同于传统关系型数据库,以key-value的形式存储数据
Redis将数据放置与内存,性能优越,官方给的测试结果:读取数据速度是110000次/s,写入速度为81000次/s
Redis开源免费,提供多种编程语言接口,包括主流的:java,python,php,c#等几十种编程语言,遵从BSD协定
Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
二、Redis适用的业务场景
Redis不能替代传统关系型数据库
适用于:
缓冲高并发读写的实时数据
网站最新信息列表,用户点击计数器,各类信息的实时排名
不适用于:
对事务要求高的业务
需要使用SQL的业务场景
2. redis常用数据类型
一、redis数据类型介绍
Redis实际上是一个数据结构服务器,不光以传统文本的key-value方式存储数据,redis的value除了包括传统的文本value,还可以包括多种形式的数据结构以存储更加复杂的数据结构数据。redis的value常用的数据结构包括:
| 类型 | 简介 | 特性 | 场景 |
| — | — | — | — |
| String(字符串) | 二进制数据 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | 头像存储 |
| Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
| List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
| Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
| Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
3. redis相关命令
一、连接radis命令
语法
redis-cli -h host -p port -a password
实例
演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。
redis-cli -h 127.0.0.1 -p 6379 -a “mypass”
有时候会有中文乱码。要在 redis-cli 后面加上 --raw
redis-cli --raw
二、其他常用命令
flushdb清空当前数据库的所有值(慎用)
select切换数据库
select 15切换到第16个数据库
select 1 切换到第1个数据库
scan查看当前数据库的所有key
例如:scan 0 match * count 100
其中0为产生一个新的游标,match后为匹配模式 *为所有,count 为显示数量
4. redis的key
一、简介
redis的key用来定位数据,可以想象成引用数据的标签
key在当前数据库中不能有重值(默认16个数据库,数据库可以想象成分类目录,一般情况一个业务系统的数据放在一个数据库中)
key的名字不宜过长(超过1024),否则影响性能
key最多可以存512M
key命名规则除了空格、\n换行外,其他的字符都可以
二、key命令
语法
Redis 键命令的基本语法如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379>DEL runoobkey
(integer) 1
在以上实例中 DEL 是一个命令, runoobkey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0
Redis keys 命令
查看key
| 命令 | 描述 |
| — | — |
| exists key | 查找指定key是否存在 |
| keys pattern | 通配符匹配符合条件的key |
| dbsize | 查看当前数据库key数量 |
| type key | 查看key的值类型 |
删除key
| 命令 | 描述 |
| — | — |
| del key1 key2 | 删除指定key |
| flushdb | 删除当前数据库的所有key |
| flushall | 删除所有数据库中的key |
修改key
| 命令 | 描述 |
| — | — |
| rename oldkey newkey | 重命名key |
其他操作
| 命令 | 描述 |
| — | — |
| expire key seconds | 指定key过期时间,秒为单位,过期后自动删除 |
| ttl key | 返回key过期时间 |
| select dbname | 选择数据库 |
| move key dbname | 将key移动到指定数据库 |
三、示例
keys *查询所有key
exists查看key是否存在
返回1为存在,0为不存在
dbsize查看当前数据库数量
type key查看key对应value的数据类型
del删除指定key
rename重命名key
expire设置key过期时间
ttl查看key过期时间
5. redis字符串(Strings)
一、简介
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
二、命令
设定key值
| 命令 | 描述 |
| — | — |
| set key value | 设置key对应的string类型的值 |
| mset key1 value1 keyN valueN | 一次设置多个key值 |
| setnx key value | 只有在 key 不存在时设置 key 的值 |
查询key值
| 命令 | 描述 |
| — | — |
| get key | 设置key对应的string类型的值 |
| mget key1 keyN | 一次获取多个key值 |
修改key值
| 命令 | 描述 |
| — | — |
| incr key | 对key的值做加1操作 |
| decr key | 对key的值做减1操作 |
| incrby key integer | 同incr,加指定值 |
| decrby key integer | 同decr,减指定值 |
| append key value | 给指定key的字符串追加value |
其他操作key值(操作后不保存)
| 命令 | 描述 |
| — | — |
| substr key start end | 返回截取过的key的字符串 |
| getrange key start end | 返回截取过的key的字符串 |
| strlen key | 返回key所储存的字符串值的长度 |
三、常用操作举例
set语句设置key对应的value值
mset语句获取key对应的value值
get语句获取key对应value值
mget语句获取多个key对应value值
incr递增步长
incrby指定步长
decr递减步长
decrby指定步长
append追加字符串
substr截取字符串
6. Redis哈希(Hash)
一、简介
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个 hash 可以存储 232 -1 键值对(40多亿)。
二、hash命令
添加哈希表字段
| 命令 | 描述 |
| — | — |
| lrange key start end | 获取链表中从start开始到end的值,start从0开始计,倒数第一元素的位置为-1 |
| llen key | 获得列表元素的个数 |
| lindex key 位置 | 获取指定位置列表的值 |
查询哈希表字段
| 命令 | 描述 |
| — | — |
| HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
| HGET key field | 获取存储在哈希表中指定字段的值。 |
| HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
| HKEYS key | 获取所有哈希表中的字段 |
| HLEN key | 获取哈希表中字段的数量 |
| HMGET key field1 [field2] | 获取所有给定字段的值 |
| HVALS key | 获取哈希表中所有值 |
删除哈希表字段
| 命令 | 描述 |
| — | — |
| HDEL key field1 [field2] | 删除一个或多个哈希表字段 |
| llen key | 获得列表元素的个数 |
| lindex key 位置 | 获取指定位置列表的值 |
操作哈希表字段
| 命令 | 描述 |
| — | — |
| HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
| HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
| lindex key 位置 | 获取指定位置列表的值 |
| HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
7. Redis列表(List)
一、简介
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),这使得list既可以用作栈,也可以用作队列。
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
二、命令
添加list元素
| 命令 | 描述 |
| — | — |
| lpush key value1 valueN | 左侧添加元素到列表(头部添加) |
| rpush key value1 valueN | 右侧添加元素到列表(尾部添加) |
| linsert key BEFORE|AFTER pivot value | 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 |
查看list元素
| 命令 | 描述 |
| — | — |
| lrange key start end | 获取链表中从start开始到end的值,start从0开始计,倒数第一元素的位置为-1 |
| llen key | 获得列表元素的个数 |
| lindex key 位置 | 获取指定位置列表的值 |
移出list元素
| 命令 | 描述 |
| — | — |
| lpop key | 左侧获取并删除一个元素(头部删除) |
| rpop key | 右侧获取并删除一个元素(尾部删除) |
| lrem key count value | 删除指定value的元素 |
| ltrim key count value | 保留指定范围内的元素,其他的删除 |
操作list元素
| 命令 | 描述 |
| — | — |
| lset key index value | 通过索引来设置元素的值 |
8. Redis集合(Set)
一、简介
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
二、命令
添加集合
| 命令 | 描述 |
| — | — |
| SADD KEY_NAME VALUE1…VALUEN | 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略 |
查询集合
| 命令 | 描述 |
| — | — |
| SMEMBERS key | 返回集合中的所有的成员 |
| SINTER KEY KEY1…KEYN | 返回给定所有给定集合的交集 |
| SDIFF FIRST_KEY OTHER_KEY1…OTHER_KEYN | 返回给定集合之间的差集 |
| SUNION KEY KEY1…KEYN | 返回给定集合的并集 |
| SCARD KEY_NAME | 返回集合中元素的数量 |
移出集合成员
| 命令 | 描述 |
| — | — |
| SPOP key [count] | 移除集合中的指定 key 的一个或多个随机元素 |
| SREM KEY MEMBER1…MEMBERN | 移除集合中的一个或多个成员元素 |
| SMOVE SOURCE DESTINATION MEMBER | 将指定成员 member 元素从 source 集合移动到 destination 集合 |
9. Redis有序集合(sorted set)
一、简介
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的权。redis正是通过权值来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
二、命令
添加元素到集合
| 命令 | 描述 |
| — | — |
| ZADD key score1 member1 [score2 member2] | 添加一个或多个成员,或者更新已存在成员的分数 |
删除集合元素
| 命令 | 描述 |
| — | — |
| ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
修改集合元素
| 命令 | 描述 |
| — | — |
| ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
查询集合元素
| 命令 | 描述 |
| — | — |
| ZCARD key | 获取有序集合的成员数 |
| ZRANK key member | 返回有序集合中指定成员的索引 |
| ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
| ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |
| ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
| ZSCORE key member | 返回有序集中,成员的分数值 |
| ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
10. Redis持久化
redis为了内部数据的安全,会把本身的数据以文件的形式保存到硬盘一份,在服务器重启之后会自动把硬盘的数据恢复到内存redis的里边,数据保存到硬盘的过程就称为持久化
一、snap shotting快照持久化
简介
该持久化默认开启,一次性把redis中全部的数据保存一份到硬盘中,如果数据非常多,就不适合频繁该持久化操作
文件位置
Redis快照持久化频率,配置文件修改
满足在X秒内,超过Ykb大小的数据改变,则保存
快照文件配置
手动建立快照
本地备份
redis-cli bgsave
异机备份
redis-cli -p 192.168.1.1 6379 bgsave
二、append only file(AOF持久化)
本质
把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体的指令而已
开启AOF持久化(会清空数据库)
修改配置后重启服务
AOF追加持久化备份频率
AOF备份文件压缩优化
本地备份
redis-cli bgrewriteaof
异机备份
redis-cli -p 192.168.1.1 6379 bgrewriteaof
11. Redis事务
一、Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
二、实例
以下是一个事务的例子, 它先以MULTI开始一个事务, 然后将多个命令入队到事务中, 最后由EXEC命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379>SET book-name “Mastering C++ in 21 days”
QUEUED
redis 127.0.0.1:6379>GET book-name
QUEUED
redis 127.0.0.1:6379>SADD tag “C++” “Programming” “Mastering Series”
QUEUED
redis 127.0.0.1:6379>SMEMBERS tag
QUEUED
redis 127.0.0.1:6379>EXEC
1) OK
2) “Mastering C++ in 21 days”
3) (integer)3
4) 1) “Mastering Series”
2) “C++”
3) “Programming”
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
比如:
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
三、Redis 事务命令
12. Redis数据备份与恢复
一、数据备份(SAVE)
Redis SAVE 命令用于创建当前数据库的备份。
语法
redis Save 命令基本语法如下:
redis 127.0.0.1:6379> SAVE
实例
redis 127.0.0.1:6379> SAVE
OK
该命令将在 redis 安装目录中创建dump.rdb文件。
二、数据备份(BGSAVE)
创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。
实例
127.0.0.1:6379> BGSAVE
Background saving started
三、恢复数据
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
redis 127.0.0.1:6379> CONFIG GET dir
1) “dir”
2) “/usr/local/redis/bin”
以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。