Redis 是一种高级的 key-value 的存储系统
Key 是字符串类型, 我们设计程序的时候尽可能满足如下几点:
1)key 不要太长, 最好不要操作 1024 个字节, 这会消耗内存和降低查找效率
2)key 不要太短, 如果太短会降低 key 的可读性
3)在项目中, key 最好有一个统一的命名规范(根据企业的规范)
Value 支持五种数据类型:
1)字符串型 string
2)字符串列表 lists
3)字符串集合 sets
4)有序字符串集合 sorted sets
5)哈希类型 hashs
我们对 Redis 的学习, 主要是对数据的存储, 下面将来学习各种 Redis 的数据类型的 存储操作:
1.存储字符串 String
字符串类型是 Redis 中最为基础的数据存储类型, 它在 Redis 中是二进制安全的, 这 便意味着该类型可以接受任何格式的数据, 如 JPEG 图像数据或 JSON 对象描述信息等. 在 Redis 中字符串类型的 Value 最多可以容纳的数据长度是 512M
1)set key value: 设定 key 持有指定的字符串 value, 如果该 key 存在则进行覆盖 操作. 总是返回 "OK"
2)get key: 获取 key 的 value. 如果与该 key 关联的 value 不是 String 类型, Redis 将返回错误信息, 因为 get 命令只能用于获取 String value; 如果该 key 不存在, 返 回 null.
set-get Key
3)getset key value: 先获取该 key 的值, 然后在设置该 key 的值.
getset key
4)incr key: 将指定的 key 的 value 原子性的递增 1. 如果该 key 不存在, 其初始值 为 0, 在 incr 之后其值为 1. 如果 value 的值不能转成整型, 如 hello, 该操作将执 行失败并返回相应的错误信息.
5)decr key: 将指定的 key 的 value 原子性的递减 1. 如果该 key 不存在, 其初始值 为 0, 在 incr 之后其值为 - 1. 如果 value 的值不能转成整型, 如 hello, 该操作将执 行失败并返回相应的错误信息.
incr-decr Key
6)incrby key increment: 将指定的 key 的 value 原子性增加 increment, 如果该 key 不存在, 器初始值为 0, 在 incrby 之后, 该值为 increment. 如果该值不能转成 整型, 如 hello 则失败并返回错误信息
7)decrby key decrement: 将指定的 key 的 value 原子性减少 decrement, 如果 该 key 不存在, 器初始值为 0, 在 decrby 之后, 该值为 decrement. 如果该值不能 转成整型, 如 hello 则失败并返回错误信息
incrby-decrby
8)append key value: 如果该 key 存在, 则在原有的 value 后追加该值; 如果该 key 不存在, 则重新创建一个 key/value
append key
2.存储 lists 类型
在 Redis 中, List 类型是按照插入顺序排序的字符串链表. 和数据结构中的普通链表 一样, 我们可以在其头部 (left) 和尾部 (right) 添加新的元素. 在插入时, 如果该键并不 存在, Redis 将为该键创建一个新的链表. 与此相反, 如果链表中所有的元素均被移 除, 那么该键也将会被从数据库中删除. List 中可以包含的最大元素数量是 4294967295.
从元素插入和删除的效率视角来看, 如果我们是在链表的两头插入或删除元素, 这将 会是非常高效的操作, 即使链表中已经存储了百万条记录, 该操作也可以在常量时间 内完成. 然而需要说明的是, 如果元素插入或删除操作是作用于链表中间, 那将会是 非常低效的. 相信对于有良好数据结构基础的开发者而言, 这一点并不难理解.
1)lpush key value1 value2...: 在指定的 key 所关联的 list 的头部插入所有的 values, 如果该 key 不存在, 该命令在插入的之前创建一个与该 key 关联的空链 表, 之后再向该链表的头部插入数据. 插入成功, 返回元素的个数.
2)rpush key value1,value2...: 在该 list 的尾部添加元素
3)lrange key start end: 获取链表中从 start 到 end 的元素的值, start,end 可 为负数, 若为 - 1 则表示链表尾部的元素,-2 则表示倒数第二个, 依次类推...
lpush-rpush-lrange
"0" 和 "-1" 不是一个类型意义."0" 代表列表第 0 个元素,"-1" 则代表从右往前第几个开始数数. 0 -1 代表选择 "列表第一个个元素至倒数第一个元素" 中所有元素
4)lpushx key value: 仅当参数中指定的 key 存在时 (如果与 key 管理的 list 中没 有值时, 则该 key 是不存在的) 在指定的 key 所关联的 list 的头部插入 value.
5)rpushx key value: 在该 list 的尾部添加元素
lpushx-rpushx
6)lpop key: 返回并弹出指定的 key 关联的链表中的第一个元素, 即头部元素.
7)rpop key: 从尾部弹出元素.(此处弹出也是删除)
lpop-rpop
8) rpoplpush resource destination: 将链表中的尾部元素弹出并添加到头部
此处的 resource 和 destination 都是列表
rpoplpush
9)llen key: 返回指定的 key 关联的链表中的元素的数量.
llen
10)lset key index value: 设置链表中的 index 的脚标的元素值, 0 代表链表的头元素,-1 代表链表的尾元素.
lset
11)lrem key count value: 删除 count 个值为 value 的元素, 如果 count 大于 0, 从头向尾遍历并删除 count 个值为 value 的元素, 如果 count 小于 0, 则从尾向头遍历并删除. 如果 count 等于 0, 则删除链表中所有等于 value 的元素.
lrem
12)linsert key before|after pivot value: 在 pivot 元素前或者后插入 value 这个 元素.
linsert
List 表中所有命令前面加上 "l", 意思是 list, 同理后面的命令都是特定数据结构的前缀, 方便记忆
3.存储 sets 类型
在 Redis 中, 我们可以将 Set 类型看作为没有排序的字符集合, 和 List 类型一样, 我 们也可以在该类型的数据值上执行添加, 删除或判断某一元素是否存在等操作. 需要 说明的是, 这些操作的时间是常量时间. Set 可包含的最大元素数是 4294967295(4G).
和 List 类型不同的是, Set 集合中不允许出现重复的元素. 和 List 类型相比, Set 类 型在功能上还存在着一个非常重要的特性, 即在服务器端完成多个 Sets 之间的聚合计 算操作, 如 unions,intersections 和 differences. 由于这些操作均在服务端完成, 因此效率极高, 而且也节省了大量的网络 IO 开销
1)sadd key value1,value2...: 向 set 中添加数据, 如果该 key 的值已有则不会 重复添加
2)smembers key: 获取 set 中所有的成员
3)scard key: 获取 set 中成员的数量(类似 llen)
sadd-smembers-scard
4)sismember key member: 判断参数中指定的成员是否在该 set 中, 1 表示存 在, 0 表示不存在或者该 key 本身就不存在
5)srem key member1,member2...: 删除 set 中指定的成员
srem-sismember
6)srandmember key: 随机返回 set 中的一个成员
srandmember
7)sdiff sdiff key1 key2: 返回 key1 与 key2 中相差的成员, 而且与 key 的顺序有 关. 即返回差集.
sdiff
简单理解为: key1 中在 key2 中不存在的值.
8)sdiffstoredestination key1 key2: 将 key1,key2 相差的成员存储在 destination 上
sdiffstore
9)sinter key[key1,key2...]: 返回交集.
10)sinterstore destination key1 key2: 将返回的交集存储在 destination 上
sinterstore -sinter
11)sunionkey1,key2: 返回并集.
12)sunionstoredestination key1 key2: 将返回的并集存储在 destination 上
sunionstore -sunion
4.存储 sortedset
Sorted-Sets 和 Sets 类型极为相似, 它们都是字符串的集合, 都不允许重复的成员出 现在一个 Set 中. 它们之间的主要差别是 Sorted-Sets 中的每一个成员都会有一个分 数 (score) 与之关联, Redis 正是通过分数来为集合中的成员进行从小到大的排序. 然 而需要额外指出的是, 尽管 Sorted-Sets 中的成员必须是唯一的, 但是分数(score) 却是可以重复的.
在 Sorted-Set 中添加, 删除或更新一个成员都是非常快速的操作, 其时间复杂度为 集合中成员数量的对数. 由于 Sorted-Sets 中的成员在集合中的位置是有序的, 因此, 即便是访问位于集合中部的成员也仍然是非常高效的. 事实上, Redis 所具有的这一 特征在很多其它类型的数据库中是很难实现的, 换句话说, 在该点上要想达到和 Redis 同样的高效, 在其它数据库中进行建模是非常困难的.
例如: 游戏排名, 微博热点话题等使用场景.
1)zadd key score member score2 member2 ... : 将所有成员以及该成员的 分数存放到 sorted-set 中
2)zcard key: 获取集合中的成员数量
zcard-zadd
3)zcountkey min max: 获取分数在 [min,max] 之间的成员
zincrbykey increment member: 设置指定成员的增加的分数.
zrangekey start end [withscores]: 获取集合中脚标为 start-end 的成员,[withscores]参数表明返回的成员包含其分数.
zrangebyscorekey min max [withscores] [limit offset count]: 返回分数在 [min,max] 的成员并按照分数从低到高排序.[withscores]: 显示分数;[limit offset count]:offset, 表明从脚标为 offset 的元素开始并返回 count 个成员.
zrankkey member: 返回成员在集合中的位置.
zremkey member[member...]: 移除集合中指定的成员, 可以指定多个成员.
zscorekey member: 返回指定成员的分数
5.存储 hash
Redis 中的 Hashes 类型可以看成具有 String Key 和 String Value 的 map 容器. 所 以该类型非常适合于存储值对象的信息. 如 Username,Password 和 Age 等. 如果 Hash 中包含很少的字段, 那么该类型的数据也将仅占用很少的磁盘空间. 每一个 Hash 可以存储 4294967295 个键值对.
1)hsetkey field value: 为指定的 key 设定 field/value 对(键值对).
2)hgetallkey:** 获取 key 中的所有 filed-vaule
hset-hgetall
3)hgetkey field: 返回指定的 key 中的 field 的值
hget
4)hmset key fields: 设置 key 中的多个 filed/value
5)hmget key fileds: 获取 key 中的多个 filed 的值
6)hexists key field: 判断指定的 key 中的 filed 是否存在
7)hlen key: 获取 key 所包含的 field 的数量
8)hincrby key field increment: 设置 key 中 filed 的值增加 increment, 如: age 增加 20
来源: http://www.jianshu.com/p/e0bd94ed4e57