Redis 的认识
Redis 介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构 key-value 存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis 特点
- 读写速度快。 每秒可执行大约110000次的写(SET)操作,每秒大约可执行81000次的读(GET)操作。
- 丰富的数据类型。 Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。
- 原子性。 Redis中所有的操作命令都是原子操作,确保了如果两个客户端并发访问,Redis服务器能接收更新的值。
Redis 与其他 key-value 数据库的区别
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis 的基本使用
字符串 string
string类型在redis中是最常见的类型,value存储最大数据量为512M,可以存放json数据,图像数据等等。
- SET key value
设置指定 key 的值。 - GET key
获取指定 key 的值。 - GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 - MSET key1 value1 [key2 value2 …]
同时设置一个或多个 key-value 对。 - MGET key1 key2 [key3..]
获取所有(一个或多个)给定 key 的值。 - SETNX key value
key 不存在时设置 key 的值。 - STRLEN key
返回 key 所储存的字符串值的长度。 - INCR key
将 key 中储存的数字值增一。 - INCRBY key increment
将 key 所储存的值加上给定的增量值(increment)。 - DECR key
将 key 中储存的数字值减一。 - DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
哈希 hash
Redis 中 hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
- HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。 eg: hset person name zhangsan - HGET key field
获取存储在哈希表 key 中指定字段 field 的值。 eg: hget person name - HEXISTS key field
查看哈希表 key 中,指定的字段 field 是否存在。 - HDEL key field1 [field2]
删除一个或多个哈希表字段 - HLEN key
获取哈希表中字段的数量 - HGETALL key
获取在哈希表中指定 key 的所有字段 field 和值 value - HMGET key field1 [field2]
获取多个给定字段 field 的值 - HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。 - HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。 - HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 - HKEYS key
获取所有哈希表 key 中的字段 列表项
field
列表 List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
- LPUSH key value1 [value2]
将一个或多个值插入到列表头部(从左边插入列表)。 eg: lpush list 1 - LPOP key
移出并获取列表左边的第一个元素 - RPUSH key value1 [value2]
在列表尾部中添加一个或多个值(从右边插入列表)。 eg: rpush list a - RPOP key
移除并获取列表最后一个元素(列表右边第一个元素) - LINDEX key index
通过索引获取列表中的元素 - LLEN key
获取列表长度 - LRANGE key start stop
获取列表指定范围内的元素 LREM key count value
移除列表元素count > 0: 从头往尾移除值为 value 的元素.
count < 0: 从尾往头移除值为 value 的元素。
count = 0: 移除所有值为 value 的元素。
集合 Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
- SADD key member1 [member2]
向集合添加一个或多个成员 - SCARD key
获取集合的成员数 - SISMEMBER key member
判断 member 元素是否是集合 key 的成员 - SMEMBERS key
返回集合中的所有成员 - SPOP key
移除并返回集合中的一个随机元素 - SREM key member1 [member2]
移除集合中一个或多个成员 - SDIFF key1 [key2]
返回给定所有集合的差集 - SINTER key1 [key2]
返回给定所有集合的交集 - SUNION key1 [key2]
返回所有给定集合的并集
有序集合 Sorted Set
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
- ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数 - ZCARD key
获取有序集合的成员数 - ZCOUNT key min max
计算在有序集合中指定区间分数的成员数 - ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment - ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员[ 可返回分数 ] - ZRANK key member
返回有序集合中指定成员的索引 - ZREM key member [member …]
移除有序集合中的一个或多个成员 - ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员 - ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员 - ZSCORE key member
返回有序集中,成员的分数值