简介
Redis 是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可持久性的键值对存储数据库。
特点:
- 基于内存运行,性能高效
- 单进程单线程模型
- 丰富的数据类型
- 持久化
- 操作具有原子性
- 支持分布式,高并发读写
- 支持lua脚本
配置
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
3. 绑定的主机地址
bind 127.0.0.1
4. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
5. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
数据类型
String
string是redis最基本的类型,string类型是二进制安全的,可以包含任何数据。比如jpg图片或者序列化的对象。一个键最大能存储512MB。
常用命令:
SET key value //设置指定 key 的值
GET key //获取指定 key 的值
GETRANGE key start end //返回 key 中字符串值的子字符
GETSET key value //将给定 key 的值设为 value ,并返回 key 的旧值(old value)
SETNX key value //只有在 key 不存在时设置 key 的值
STRLEN key // 返回 key 所储存的字符串值的长度
MSET key value [key value ...] // 同时设置一个或多个 key-value 对
INCR(DECR) key //将 key 中储存的数字值增(减)一
INCRBY key increment //将 key 所储存的值加上给定的增量值(increment)
INCRBYFLOAT key increment //将 key 所储存的值加上给定的浮点增量值(increment)
APPEND key value //如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
Hash
hash 是一个键值对集合,是一个string类型的field和value的映射表。每个 hash 可以存储 2^32 - 1 键值对。
常用命令:
HSET key field value //将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值
HGET key field //获取存储在哈希表中指定字段的值
HDEL key field1 [field2] //删除一个或多个哈希表字段
HEXISTS key field //查看哈希表 key 中,指定的字段是否存在
HGETALL key //获取在哈希表中指定 key 的所有字段和值
HKEYS key //获取所有哈希表中的字段
HVALS key 获取哈希表中所有值
HLEN key //获取哈希表中字段的数量
HMGET key field1 [field2] //获取所有给定字段的值
HMSET key field1 value1 [field2 value2 ] //同时将多个 field-value (域-值)对设置到哈希表 key 中
List
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
常用命令:
LPUSH(RPUSH) key value1 [value2..] //将一个或多个值插入到列表头部(尾部)
LPUSHX(RPUSHX) key value //将一个值插入到已存在的列表头部(尾部),列表不存在则操作无效
LSET key index value //通过索引设置列表元素的值
LINDEX key index //通过索引获取列表中的元素
LPOP key //移出并获取列表第一个元素
RPOP key //移出并获取列表最后一个元素
BLPOP key1 [key2 ] timeout //移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BRPOP key1 [key2 ] timeout //移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
LRANGE key start stop //获取列表指定范围内的元素
LREM key count value //移除列表元素,
LLEN key //获取列表长度, count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。count = 0 : 移除表中所有与 VALUE 相等的值。
LTRIM key start stop //对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
Set
Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
常用命令:
SADD key member1 [member2] //向集合添加一个或多个成员
SREM key member1 [member2] //移除集合中一个或多个成员
SUNION key1 [key2] //返回所有给定集合的并集
SINTER key1 [key2] //返回给定所有集合的交集
SDIFF key1 [key2] //返回给定所有集合的差集
SUNIONSTORE destination key1 [key2] //返回给定所有集合的并集并存储在 destination 中
SINTERSTORE destination key1 [key2] //返回给定所有集合的交集并存储在 destination 中
SDIFFSTORE destination key1 [key2] //返回给定所有集合的差集并存储在 destination 中
SCARD key //获取集合的成员数
SMEMBERS key //返回集合中的所有成员
SISMEMBER key member //判断 member 元素是否是集合 key 的成员
zset
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
常用命令:
ZADD key score1 member1 [score2 member2] //向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZSCORE key member //返回有序集中,成员的分数值
ZCARD key //获取有序集合的成员数
ZCOUNT key min max //计算在有序集合中指定区间分数的成员数
ZRANGE key start stop [WITHSCORES] //通过索引区间返回有序集合指定区间内的成员
HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
常用命令:
PFADD key element [element ...] //添加指定元素到 HyperLogLog 中。
PFCOUNT key [key ...] //返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey ...] //将多个 HyperLogLog 合并为一个 HyperLogLog
Redis 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
常用命令:
SUBSCRIBE channel [channel ...] //订阅给定的一个或多个频道的信息
UNSUBSCRIBE [channel [channel ...]] //指退订给定的频道
PUBLISH channel message //将信息发送到指定的频道
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的,可以理解为一个打包的批量执行脚本。中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。