使用Radis的理由
- 可以让代码变的更简短、更易懂、更易维护,而且还可以使得代码的运行速度更快。在一般的情况下,Redis的效率和易用性比关系数据库更加出色。
- 对Redis存储的数据执行随机读写的速度总是非常迅速的。
- 可以避免写入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,可以改善程序的性能。
Redis数据结构详解
Redis可以存储键和5种不同数据结构关系之间的映射,它们之间的关系如下表所示:
结构类型 | STRING | LIST | SET | HASH | ZSET |
结构存储的值 | 字符串、整数和浮点数 | 链表结构,每个节点都包含一个字符串 | 无序收集器,被包含的字符串都是独一无二、各不相同的 | 键值对的无序散列表 | 字符串成员(member)和浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 |
结构的读写能力 | 操作字符串或者字符串的一部分;对象整数和浮点数执行自增或自减操作 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者获取元素 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 | 添加、获取、移除单个键值对;获取所有的键值对 | 添加、获取、删除单个元素;根据分值范围或者成员来获取元素 |
Redis中的字符串
命令 | 行为 |
GET | 获取存储在给定键中的值 |
SET | 设置存储在给定键中的值 |
DEL | 删除存储在给定键中的值 |
使用示例:
127.0.0.1:6379> set hello world # 设置键hello的为值world
OK
127.0.0.1:6379> get hello # 获取hello的值
"world"
127.0.0.1:6379> del hello # 删除这个键值对
(integer) 1
127.0.0.1:6379> get hello # 键已经被删除了,值变为null
(nil)
127.0.0.1:6379>
Redis中的列表
redis中对链表(linked-list)结构的支持使得它在键值对存储世界中独树一帜。一个列表结构可以有序的存储多个字符串。
命令 | RPUSH | LRANGE | LINDEX | LPOP |
行为 | 将给定值推入列表的右端 | 获取列表在给定范围上的所有值 | 获取列表在给定位置上的单个元素 | 从列表的左端弹出一个值,并返回该值 |
使用范例:
127.0.0.1:6379> rpush list-key item #向列表推入新元素
(integer) 1 #返回列表的当前的长度
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item #列表中的元素允许重复存储
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1 #0为起始索引,-1表示结束索引,取出列表中的所有元素
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lindex list-key 1 #查询列表中单个元素
"item"
127.0.0.1:6379> lpop list-key #从列表中弹出一个元素,该元素不再存在该列表中
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
127.0.0.1:6379>
Redis的集合
集合通过使用散列表来保证自己存储的每个字符串都是各不相同的,而且Redis的集合采用的是无序的方式去存储
命令 | SADD | SMEMBERS | SISMEMER | SREM |
行为 | 将给定元素添加到集合 | 返回集合包含的所有元素 | 检查给定元素是否存在于集合中 | 如果给定的元素存在于集合中,那么将移除该元素 |
使用范例:
127.0.0.1:6379> sadd set-key item # 命令返回1表示这个元素成功的被添加到集合中
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item3
(integer) 1
127.0.0.1:6379> sadd set-key item #集合中不能存储重复的元素
(integer) 0
127.0.0.1:6379> smembers set-key #获取集合的所有元素
1) "item2"
2) "item3"
3) "item"
127.0.0.1:6379> sismember set-key itme4 #检查一个元素是否存在于集合中
(integer) 0 #0表示不在集合中,1表示存在于集合中
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem set-key item2 #移除集合中的元素
(integer) 1 #1表示移除的数量为1
127.0.0.1:6379> srem set-key item2
(integer) 0 #0表示不存在需要移除的元素
127.0.0.1:6379> smembers set-key
1) "item3"
2) "item"
127.0.0.1:6379>
Redis的散列
Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符类型还可以是数字类型。其中,散列中的键是不重复的无序排序方式。
命令 | HSET | HGET | HGETALL | HDEL |
行为 | 在散列里面关联起来给定的键值对 | 获取指定散列键的值 | 获取散列中的所有键值对 | 如果给定的键存在于该散列,则移除这个键 |
使用范例:
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1 #1表示给定的键不存在于该散列中
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 0 #表示给定的键已经存在于散列中
127.0.0.1:6379> hgetall hash-key #获取所有的键值对
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2 #删除键值对
(integer) 1 #1表示给定键存在于散列中
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 0 #0表示需要删除的键不存在
127.0.0.1:6379> hget hash-key sub-key1 #获取某一个键的值
"value1"
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
127.0.0.1:6379>
Redis的有序集合
有序集合和散列一样,都用于存储键值对。其中,有序集合的键又称为成员,每个成员都是各部相同的,而有序集合的值则被称为分值,分值必须为浮点数.
命令 | ZADD | ZRANGE | ZRANGEBYSCORE | ZREM |
行为 | 将一个带有给定分值的成员添加到有序集合里面去 | 根据元素在有序排列中所处的位置,从有序集合里面获取多个元素 | 获取有序集合在给定分值范围内的所有元素 | 如果给定成员存在于有序集合,那么一次该成员 |
使用范例:
127.0.0.1:6379> zadd zset-key 728 member1 #添加元素
(integer) 1 #1表示新添加元素的数量
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0 #键不能重复
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores #获取有序集合中的所有元素
1) "member1" #按照分值大小进行排序
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores #获取某范围内分值对应的元素
1) "member1"
2) "728"
127.0.0.1:6379> zrem zset-key member1 #移除有序集合元素
(integer) 1 #1表示被移除元素的数量
127.0.0.1:6379> zrem zset-key member1
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
127.0.0.1:6379>