redis基本概念
redis 概念及使用场景
Redis是基于C编写的key-value存储系统,是一种NOSQL系统。
Redis特点:
- 高效性:Redis可以实现每秒百万级别次数的读取和十万级别次数的写入。
- 原子性:Redis所有操作都是原子性的,并支持对几个操作合并后进行原子操作。
- 支持多种数据结构: Redis除了支持基本的key-value模式,还支持多种数据结构的存储(详情见下)。
- 稳定性:数据的持久化,集群的主从复制。
- 其他特性:支持过期时间,支持事务,消息订阅。
Redis应用场景:
一般作为缓存数据库来辅助持久化的数据库
redis基本数据类型
Redis支持5种value类型,并扩展了3种数据类型
5种value类型:
- String(字符串)
- Redis的基本类型,一个key对应一个value,string类型最大能存储512MB.
- string类型是二进制安全的,即Redis的string
可以包含任何数据
,如JPG图片或序列化的对象等。
- List(列表)
- 字符串双向链表,按照插入顺序排序
- 可以在列表头部(左边)或者尾部(右边)添加元素。
- Hash(哈希)
- 键值对的集合
- Redis的hash是一个string类型的field和value的映射表,hash特别
适合用于存储对象结构
。 - 可以单独的更改某一项属性值,而不用像memcached取出全部元素,序列化修改再反序列化回去
- Set(集合)
- Redis的Set是string类型的无序集合,
内部元素唯一
,对同一元素的多次插入,会忽略非第一次的插入。 - 集合内部通过哈希表实现,添加、删除、查找的复杂度都是O(1).
- Redis的Set是string类型的无序集合,
- Zset(有序集合)
- 和Set一样是String的集合,并且内部元素唯一。
- 和Set不同的是,每个元素会关联一个double类型的分散,用于对集合中的成员从小到大排序。
- 集合中最大的成员数为2^32-1,即40亿+个成员。
3种扩展类型:
- Bitmaps
- HyperLogLogs
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
- GEO
Redis数据结构的底层实现
Redis为了平衡空间和时间效率,针对value的具体类型在底层采取不用的数据结构来实现。
ziplist压缩列表可以作为Zset、Set、List三种数据类型的底层实现。
ziplist是一种经过特殊编码之后的连续内存块顺序型数据结构。
redis基本操作命令
String类型
序号 | 命令及描述 |
---|---|
1 | SET key value 设置指定 key 的值示例:SET hello world |
2 | GET key 获取指定 key 的值。示例:GET hello |
3 | GETRANGE key start end 返回 key 中字符串值的子字符示例:GETRANGE hello 0 3 |
4 | GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。示例:GETSET hello world2 |
5 | [MGET key1 key2…] 获取所有(一个或多个)给定 key 的值。示例:MGET hello world |
6 | SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。示例:SETEX hello 10 world3 |
7 | SETNX key value 只有在 key 不存在时设置 key 的值。示例:SETNX kkb redisvalue |
8 | SETRANGE key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。示例:SETRANGE kkb 0 helloredis |
9 | STRLEN key 返回 key 所储存的字符串值的长度。示例:STRLEN kkb |
10 | [MSET key value key value …] 同时设置一个或多个 key-value 对。示例:MSET kkb2 kkbvalue2 kkb3 kkbvalue3 |
12 | [MSETNX key value key value …] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。示例:MSETNX kkb4 kkbvalue4 kkb5 kkbvalue5 |
13 | PSETEX key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。示例:PSETEX kkb6 6000 kkb6value |
14 | INCR key 将 key 中储存的数字值增一。示例:set kkb7 1INCR kkb7GET kkb7 |
15 | INCRBY key increment 将 key 所储存的值加上给定的增量值(increment) 。示例:INCRBY kkb7 2get kkb7 |
16 | INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。示例:INCRBYFLOAT kkb7 0.8 |
17 | DECR key 将 key 中储存的数字值减一。示例:set kkb8 1DECR kkb8GET kkb8 |
18 | DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。示例:DECRBY kkb8 3 |
19 | APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。示例:APPEND kkb8 hello |
Redis中对可以的操作
序号 | 命令及描述 |
---|---|
1 | DEL key 该命令用于在 key 存在时删除 key。示例:del kkb5 |
2 | DUMP key 序列化给定 key ,并返回被序列化的值。示例:DUMP key1 |
3 | EXISTS key 检查给定 key 是否存在。示例:exists kkb |
4 | EXPIRE key seconds 为给定 key 设置过期时间,以秒计。示例:expire kkb 5 |
6 | PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。示例:PEXPIRE set2 3000000 |
8 | KEYS pattern 查找所有符合给定模式( pattern)的 key 。示例:keys * |
10 | PERSIST key 移除 key 的过期时间,key 将持久保持。示例:persist set2 |
11 | PTTL key 以毫秒为单位返回 key 的剩余的过期时间。示例:pttl set2 |
12 | TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。示例:ttl set2 |
13 | RANDOMKEY 从当前数据库中随机返回一个 key 。示例: randomkey |
14 | RENAME key newkey 修改 key 的名称示例:rename set5 set8 |
15 | RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。示例:renamenx set8 set10 |
16 | TYPE key 返回 key 所储存的值的类型。示例:type set10 |
- redis当中对hash列表的操作
序号 | 命令及描述 |
---|---|
1 | HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。示例:HSET key1 field1 value1 |
2 | HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。示例:HSETNX key1 field2 value2 |
3 | [HMSET key field1 value1 field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。示例:HMSET key1 field3 value3 field4 value4 |
4 | HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。示例:HEXISTS key1 field4HEXISTS key1 field6 |
5 | HGET key field 获取存储在哈希表中指定字段的值。示例:HGET key1 field4 |
6 | HGETALL key 获取在哈希表中指定 key 的所有字段和值示例:HGETALL key1 |
7 | HKEYS key 获取所有哈希表中的字段示例:HKEYS key1 |
8 | HLEN key 获取哈希表中字段的数量示例:HLEN key1 |
9 | [HMGET key field1 field2] 获取所有给定字段的值示例:HMGET key1 field1 field2 |
10 | HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。示例:HSET key2 field1 1HINCRBY key2 field1 1HGET key2 field1 |
11 | HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。示例:HINCRBYFLOAT key2 field1 0.8 |
12 | HVALS key 获取哈希表中所有值示例:HVALS key1 |
13 | [HDEL key field1 field2] 删除一个或多个哈希表字段示例:HDEL key1 field1 HVALS key1 |
redis当中对list列表的操作
序号 | 命令及描述 |
---|---|
1 | [LPUSH key value1 value2] 将一个或多个值插入到列表头部示例:LPUSH list1 value1 value2 |
2 | LRANGE key start stop查看list当中所有的数据示例:LRANGE list1 0 -1 |
3 | LPUSHX key value 将一个值插入到已存在的列表头部示例:LPUSHX list1 value3LINDEX list1 0 |
4 | [RPUSH key value1 value2] 在列表中添加一个或多个值示例:RPUSH list1 value4 value5LRANGE list1 0 -1 |
5 | RPUSHX key value 为已存在的列表添加值示例:RPUSHX list1 value6 |
6 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素示例:LINSERT list1 BEFORE value3 beforevalue3 |
7 | LINDEX key index 通过索引获取列表中的元素示例:LINDEX list1 0 |
8 | LSET key index value 通过索引设置列表元素的值示例:LSET list1 0 hello |
9 | LLEN key 获取列表长度示例:LLEN list1 |
10 | LPOP key 移出并获取列表的第一个元素示例:LPOP list1 |
11 | RPOP key 移除列表的最后一个元素,返回值为移除的元素。示例:RPOP list1 |
12 | [BLPOP key1 key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。示例:BLPOP list1 2000 |
13 | [BRPOP key1 key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。示例:BRPOP list1 2000 |
14 | RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回示例:RPOPLPUSH list1 list2 |
15 | BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。示例:BRPOPLPUSH list1 list2 2000 |
16 | LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。示例:LTRIM list1 0 2 |
17 | DEL key1 key2删除指定key的列表示例:DEL list2 |
Redis操作set集合
序号 | 命令及描述 |
---|---|
1 | [SADD key member1 member2] 向集合添加一个或多个成员示例:SADD set1 setvalue1 setvalue2 |
2 | SMEMBERS key 返回集合中的所有成员示例:SMEMBERS set1 |
3 | SCARD key 获取集合的成员数示例:SCARD set1 |
4 | [SDIFF key1 key2] 返回给定所有集合的差集示例:SADD set2 setvalue2 setvalue3SDIFF set1 set2 |
5 | [SDIFFSTORE destination key1 key2] 返回给定所有集合的差集并存储在 destination 中示例:SDIFFSTORE set3 set1 set2 |
6 | [SINTER key1 key2] 返回给定所有集合的交集示例:SINTER set1 set2 |
7 | [SINTERSTORE destination key1 key2] 返回给定所有集合的交集并存储在 destination 中示例:SINTERSTORE set4 set1 set2 |
8 | SISMEMBER key member 判断 member 元素是否是集合 key 的成员示例:SISMEMBER set1 setvalue1 |
9 | SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合示例:SMOVE set1 set2 setvalue1 |
10 | SPOP key 移除并返回集合中的一个随机元素示例:SPOP set2 |
11 | [SRANDMEMBER key count] 返回集合中一个或多个随机数示例:SRANDMEMBER set2 2 |
12 | [SREM key member1 member2] 移除集合中一个或多个成员示例:SREM set2 setvalue1 |
13 | [SUNION key1 key2] 返回所有给定集合的并集示例:SUNION set1 set2 |
14 | [SUNIONSTORE destination key1 key2] 所有给定集合的并集存储在 destination 集合中示例:SUNIONSTORE set5 set1 set2 |
Redis 中的HyperLogLog
序号 | 命令及描述 |
---|---|
1 | PFADD key element [element …] 添加指定元素到 HyperLogLog 中。 |
2 | PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。 |
3 | PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog |
示例
redis 127.0.0.1:6379> PFADD runoobkey “redis”
- (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey “mongodb”- (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey “mysql”- (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3