上篇文章简单的介绍了redis的使用场景和优缺点,本文接着解答如下几个问题:redis
这些问题实际上归结起来都和redis 提供的数据结构有关,接下来重点带着这些问题重点解读redis的数据结构和使用场景。(·我以为技术自己不能创造价值,只有找到对应的适用场景,解决业务中的问题,才能产生价值
)。数据库
` redis 是基于key-value的数据库,全部的key都是字符串类型,针对value值的不一样,又划分为字符串,列表,集合,有序集合,散列表,(位图,hyperLoglog,GEO) 等等`。
复制代码
本文主要介绍字符串有表明性的一些命令以及对应的适用场景。json
将字符串值 value 关联到 key,若是 key 已经持有其余值, SET 就覆写旧值,无视类型,对于某个本来带有生存时(TTL)的键来讲, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除.
参数介绍:
EX second :设置键的过时时间为 second 秒。
PX millisecond :设置键的过时时间为 millisecond 毫秒
NX :只在键不存在时,才对键进行设置操做。
XX :只在键已经存在时,才对键进行设置操做。
复制代码
常见使用场景:缓存
缓存:能够将要缓存的数据序列化成json串,存储在key对应的value里,同时能够为其指定过时时间;数据结构
分布式锁: 分布式锁设计时要考虑如下问题:异步
互斥性
可重入性
死锁
锁的性能
复制代码
采用redis实现分布式锁,网上不少同窗都给了实现方案,此处就不啰嗦了。redis 实现分布式锁的优势是加锁释放锁很快。不过采用redis 实现分布式锁是有一些缺陷的,好比由于依赖键的过时机制,会致使若是加锁时正常的业务代码执行时间超出了键的过时时间,业务代码尚未执行完时,锁已经释放掉了,这样其余线程就有可能获取锁,进而致使多个线程同时得到锁,不能严格意义上保证锁的排他性。因此在业务选择时要考虑到这些方面。分布式
将 key 中储存的数字值增一。
若是 key 不存在,那么 key 的值会先被初始化为 0 ,而后再执行 INCR 操做。
若是值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误`
复制代码
常见使用场景:性能
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value 参数,能够是 0 也能够是 1 。
当 key 不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它能够将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。
offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 以内)。
复制代码
统计和查找: 结合bitcount指令,好比从10亿个无序的整数(范围在0-40亿)统计出前10个数,这种场景下使用bitmap 存储时会极大的缩小占用内存空间.spa
本文仅仅是简单的介绍了一下redis 字符串类型的部分操做命令以及其相应的使用场景,关于redis的其余数据类型以及相应的使用场景,再后续的文章中进一步进行介绍。线程