Redis 特性和应用场景
Redis 特性
速度快
Redis 使用标准 C 编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据
表明,在一个普通的 Linux 机器上,Redis 读写速度分别达到81000/s 和110000/s。
数据结构
可以将 Redis 看做“数据结构服务器”。目前,Redis 支持5种数据结构。
持久化
由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis 提供了一些策略
来保存数据,比如根据时间或更新次数。数据超过内存,使用 swap,保证数据;
memcacache 不能持久化,mongo 是部分在内存;
自动操作
Redis 对不同数据类型的操作是自动的,因此设置或增加 key 值,从一个集合中增加或删除一个
元素都能安全的操作。
支持多种语言
Redis 支持多种语言,诸如 Ruby,Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua,
Java, Scala, Clojure 等。
主-从复制
Redis 支持简单而快速的主-从复制。
官方提供了一个数据,Slave 在21秒即完成了对 Amazon 网站10Gkey set 的复制。
Sharding
很容易将数据分布到多个 Redis 实例中,但这主要看该语言是否支持。目前支持 Sharding 功能
的语言只有 PHP、Ruby 和 Scala。
1. redis 数据使用方式
redis 的作者 antirez 曾笑称其为一个数据结构服务器(data structures server),redis 的
所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。
我们可以想象我们在各种语言中的那些固有数据类型及其操作。
Redis 的几种使用方式
Strings
Hashs
Lists
Sets
Sorted Sets
Pub/Sub
Transactions
Redis 的七种特性以及适合的应用场景:
1.1. Strings
Strings 数据结构是简单的 key-value 类型,value 其实不仅是 String,也可以是数字。使用
Strings 类型,完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时
持久化,操作日志及 Replication 等功能。除了提供与 Memcached 一样的 get、set、incr、decr
等操作外,Redis 还提供了下面一些操作:
获取字符串长度 strlen
往字符串 append 内容 append
设置和获取字符串的某一段内容 setrange getrange
设置及获取字符串的某一位 getrange
批量设置一系列字符串的内容
String 是最简单的数据类型,一个 key 对应一个 Value,String 是二进制安全的。它可以包含
任何数据,图片或者其他序列化后的对象
方法
说明
特性
set
设置 key 对应的的值为 String 类型的 value
get
获取对应 key 对应的 String 的值,如果不存在返
回 nil
setnx
设置可以为对应的值为 String 类型的 value,如
果 key 存在返回 0 不覆盖,不存在返回 1
nx 的意思为 not exist
Set the value of a key, only if the
key does not exist
setex
置 key 对应的值为 String 类型的 value,并指定此
键值对应的有效期
SETEX key seconds value
例:setex mykey 10 你好
setrange
设置 key 的 value 的子字符串
setrange key 位置 替换的内容
如果替换内容没有原 value 长,
则原 value 剩余的内容将被保
留
mset
一次设置多个 key 的值,成功返回 ok,失败返回
0,要成功都成功,要不成功全部失败。
mset key1 内容一 key2 内容二
msetnx
一次设置多个 key 的值,成功返回 ok,失败返回
0,不覆盖已经存在的值,要成功都成功,要失
败都失败。
getset
设置 key 的值并返回 key 的旧值
getset key newValuse
getrange
获取 key 对应的 value 子字符串
getrange key 0 5 //获取前 6 个
字符
mget
批量获取
mget key1 key2 key3 // 没 有 设
置则返回空
incr
对 key 的值做增加操作,并返回新的值
+1
incrby
对可以的 value 加指定的值,
key 如果不存在会设置 key 并
value 为 0
incrby key1 5 //对 key1 的值加
5
decr
对 key 的值做减减操作
-1
decrby
对 key 的值减去指定值
append
给指定 key 的字符串追加 value,返回新的字符
串长度
strlen
取指定 key 的 value 值的长度
1.2. Hashs
在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储
为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项
时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增
大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。
而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
它是一个 String 类型的 field 和 value 的映射表,它的添加和删除都是平均的,hash 特别适合
用于存储对象,对于将对象存储成字符串而言,hash 会占用更少的内存,并且可以更方便
的存取整个对象. 它和 java 的 HashMap 完全类似
方法
说明
特性
hset
设置一个 hash 的 field 为指定值,如果 key 不存在则先创建
hset tab ke1 val1
hget
获取某个 hash 的某个 field 值
hget tab ke1
hsetnx
类似 string 只是操作的是 hash
hmset
批量设置 hash 的内容
hmget
获取 hash 表的全部 key 值
Hmget key field1
field2
hincrby
给 hash 表的某个字段增加值
hexists
判断 hash 表中某个 key 是否存在
hlen
返回 hash 表中的 key 数量
hdel
删除指定 hash 表的某个键值对
hkeys
返回 hash 表中所有的 key
hvals
返回 hash 表中所有的 value
hgetall
获取 hash 表中所有 key 和 value
1.3. Lists
Lists 就是链表,略有数据结构知识的人都应该能理解其结构。使用 Lists 结构,我们可以轻
松地实现最新消息排行等功能。Lists 的另一个应用就是消息队列,可以利用 Lists 的 PUSH
操作,将任务存在 Lists 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提
供了操作 Lists 中某一段的 api,你可以直接查询,删除 Lists 中某一段的元素。
Redis 的 list 是每个子元素都是 String 类型的双向链表,可以通过 push 和 pop 操作从列表的
头部或者尾部添加或者删除元素,这样 List 即可以作为栈,也可以作为队列。
方法
说明
特性
lpush
在 key 所对应的 list 头部添加一个元素
l 的意思是 left
rpush
在 key 说对应的 list 尾部添加一个元素
r 的意思是 right
lrange
显示 list 里面的内容
lrange 0 -1 //全部显示
linsert
在 key 对应的 list
linsert mylist before one myvalue
lset
设置 list 中指定下标元素的值
lset mylist index myvalue
lrem
从 key 对应的 list 中删除 n 个和 value 相同的
元素,结果返回影响元素的个数,n<0 从尾部
开始删除,n=0 全删除
lrem mylist count "value"
ltrim
保留指定 key 范围内的数据,返回 ok 成功
ltrim mylist 0 3 //0-3 是 保留的范
围
lpop
从 list 的头部删除一个元素,并返回该删除的
元素
rpop
从 list 的尾部弹出一个元素,并返回该删除的
元素
rpoplpush
从第一个 list 的尾部元素异常元素并添加到
第二个 list 的头部
rpoplpush mylistA mylistB
lindex
返回 list 位置的元素
lindex mylist 3
llen
返回 list 中元素的个数
llen mylist
1.4. Sets
Sets 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Sets 数
据结构,可以存储一些集合性的数据。
案例: