the little redis 阅读笔记

1. redis不是一个通用的数据解决方案,它只是擅长于处理某些特定的问题集合,而这些问题是我们经常关心的一类问题。
2. redis是一个全内存的kv存储工具,它会定期将数据持久化到硬盘。然而它不仅仅是一个kv存储,它拥有五种数据结构,只是其中的一种是kv结构。
3. 类似的,我们可以认为关系数据库是只拥有一种数据结构的存储工具,这种数据结构就是表,关系数据库用表这一种结构满足了各种的数据需求,即one-size-fits-all,而redis是用五种典型的数据结构处理特定类型的问题,这种设计使得redis简单而快速。
4. redis用key标识一条数据,而用value存储key对应的数据,通常情况下,redis都将value视为字节数组,而不关心它们到底是什么样的数据。因为,redis不支持value内部的查询,因此,它不需要理解value到底是什么,value可以是任何类型。
5. string类型经常用于缓存数据。
6. hash用于组织数据,方便查询。
7. list适合用于存储引用reference,或者轨迹track。
8. set适合用于标记value的其它属性,或者满足集合相关操作,交并等。
9. sort set 适用于按整数排序的应用。
10. 时间复杂度
O(1) sismember..
O(logN) zadd..
O(N) ltrim..
O(logN+M) zremrangebyscore..
O(N+M*logM) sort, 这是redis最复杂的命令,
11. 多key查询
通过mail或id来查询user,
1)不可取的方法:
set users:leto@dune.gov ”{id: 9001, email: ’leto@dune.gov’, ...}”
set users:9001 ”{id: 9001, email: ’leto@dune.gov’, ...}”
2)合理的方法:
set users:9001 ”{id: 9001, email: leto@dune.gov, ...}”
hset users:lookup:email leto@dune.gov 9001
12. 关联和索引
1) 通过list,set
13. pipeline
在redis中,操作的数据对象是每个key,因此容易造成频繁访问redis。通常情况下,客户端向redis发送请求,将等待直到收到redis的回复,然后才开始发送下一条请求。而通过pipeline可以一次性发送多条请求,这样节省了网络开支,提供了效率。
14. 事务
redis是单线程的,因此每一条命令都是原子。对于多条命令可以通过事务实现元原子性。
multi
hincrby groups:1percent balance -9000000000
hincrby groups:99percent balance 9000000000
exec
15. keys
keys支持模式匹配,它可以方便的找到左右匹配成功的key。但是keys命令不应该用在最终的产品发布代码中,因为它是对所有的key做线性扫描。
例子:设计一个bug跟踪服务,key设计为bug:account:bug_id。如果你要找出一个账户下面的所有bug进行操作,
不应该使用命令 keys bug:1233:*;
而更好的解决方案是采用hash组织数据,
hset bugs:1233 1 ”{id:1, account: 1233, subject: ’...’}”
hset bugs:1233 2 ”{id:2, account: 1233, subject: ’...’}”
如此可以通过 hkeys bugs:1233获取1233账户下的所有bugid,通过hdel bugs:1233 2删除指定的bug。
16. sort
redis的sort命令的最强大之处是它可以按照关联对象的值进行排序,关联对象可以是string,也可以是hash。
sort watch:leto by bug:*->priority get bug:*->details get #
17. publish/subscribe
client1:
    subscribe warnings
client2:
    publish warnings ”it’s over 9000!”


posted @ 2013-05-25 17:12  simon1024  阅读(163)  评论(0编辑  收藏  举报