介绍
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型
- 支持数据持久化
- 丰富的存储类型
- 支持数据备份(主从模式)
读的速度约 110000/s 写的速度约 80000/s(后边有性能测试截图,大概差不多)
单个操作原子,多个操作支持事务
运行于内存,可持久化到磁盘
默认端口6379
配置文件:redis.conf
客户端连接
redis-cli -h host -p port -a password
数据类型
string
最大存储512M
set sex manget sexgetrange sex 0 1
返回 sex 中字符串值的子字符 ma 从0开始 包括起始getset sex woman
将给定 key 的值设为 value ,并返回 key 的旧值(old value)setex sex 100 man
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)setnx sex man
只有在 key 不存在时设置 key 的值 常用于 分布式锁 🔐strlen sex
返回 key 所储存的字符串值的长度incr num
将 key 中储存的数字值增一decr num
将 key 中储存的数字值减一mset 11111 aaaaaaa 222222 bbbbbbb
批量设置k-v
通常批量设置比循环多次设置效率更高mget 11111 222222
批量获取key
hash
hash(哈希) 是一个 string 类型的 field(字段) 和 value(值) 的映射表,适合存储对象
hmset zhangsan height 180 sex man
hset也是可以新增的hget zhangsan height
获取zhangsan这个key的height字段值hmget huangliwei name sex
获取key的多个字段值hdel huangliwei name
删除一个或多个哈希表字段hexists huangliwei sex
查看哈希表 key 中,指定的字段是否存在hgetall huangliwei
获取在哈希表中指定 key 的所有字段和值hkeys huangliwei
获取所有哈希表中的字段hvals huangliweihlen huangliwei
获取hash的字段数量
list
简单字符串列表
lpush list 11111
将一个或多个值插入到列表头部rpush list 222222 333333
将一个或多个值插入到列表尾部llen list
获取列表的长度lindex list 0
通过索引获取列表值
list从0开始lrange list 0 10
获取列表指定范围内的元素lset list 0 0000001
通过索引设置列表元素的值lpop list
移出并获取列表的第一个元素rpop list
移除列表的最后一个元素,返回值为移除的元素ltrim list 1 3
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 起始包括
set
字符串类型的无序集合,不可重复
sadd nameset liyifeng zhangsansmembers nameset
返回集合中的所有成员scard nameset
获取集合的成员数spop nameset
移除并返回集合中的一个随机元素sdiff nameset1 nameset
返回第一个集合与其他集合之间的差异sinter nameset nameset1
返回给定所有集合的交集sunion nameset nameset1
返回所有给定集合的并集
zset
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复
zadd scoreset 100 zhangsan
向有序集合添加一个或多个成员,或者更新已存在成员的分数zrange scoreset 0 10 withscores
通过索引区间返回有序集合指定区间内的成员zrangebyscore scoreset 20 50
通过分数返回有序集合指定区间内的成员zcard scoreset
获取有序集合的成员数zscore scoreset yangmi
获取成员的分数zrem scoreset lisi
移除成员
HyperLogLog(了解)
Redis 在 2.8.9 版本添加了 HyperLogLog 结构 Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的
keys 命令
del hello
删除hello keyexists hello
检查key是否存在expire hello 100
为给定 key 设置过期时间100s,以秒计
不同业务的key,尽量过期时间分散一点,防止缓存雪崩ttl hello
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)keys *
列出所有的key ,*可换成模板
生产上强烈不建议使用,会阻塞进程,可使用scan
高级
事务
事务可以一次执行多个命令
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做
redis不需要回滚操作
multi
标记一个事务块的开始exec
执行所有事务块内的命令discard
取消事务,放弃执行事务块内的所有命令watch mankey
监视一个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断unwatch
取消 WATCH 命令对所有 key 的监视
脚本
Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL
Eval 命令的基本语法:
EVAL script numkeys key [key ...] arg [arg ...]
- EVAL script numkeys key [key ...] arg [arg ...] 执行脚本,numkeys:key的数量
- EVALSHA sha1 numkeys key [key ...] arg [arg ...]
- SCRIPT EXISTS script [script ...] 查看指定的脚本是否已经被保存在缓存当中
- SCRIPT FLUSH 从脚本缓存中移除所有脚本
- SCRIPT KILL 杀死当前正在运行的 Lua 脚本
- SCRIPT LOAD script 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本
连接命令
AUTH password
验证密码是否正确ECHO message
打印字符串ping
查看服务是否运行select index
切换数据库 0-15
服务器命令
save
同步保存数据到硬盘bgsave
在后台异步保存当前数据库的数据到磁盘info
获取 Redis 服务器的各种信息和统计数值flushall
删除所有数据库的所有keyflushdb
删除当前数据库的所有key
数据库备份与恢复
备份
save
bgsave
该命令将在 redis 安装目录中创建dump.rdb文件
恢复数据
只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
CONFIG GET dir
获取安装目录
安全
config get requirepass
获取设置的密码
config set requirepass admin
设置密码
auth admin
验证密码
性能
redis-benchmark -n 10000 -p
同时执行 10000 个请求来检测性能
分区
- 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作
- 涉及多个key的redis事务不能使用
分区类型:
- 范围分区 最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例;不足就是要有一个区间范围到实例的映射表。这个表要被管理
- hash分区 用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数 对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中
参考文献: