redis简单随记
redis是单进程单线程单实例(单线程主要是说工作线程,发生数据计算的线程,像io读取写入是多线程的),客户端与redis的连接使用多线程上下文切换成本高,那redis单线程是如何抗住这么多请求,除了redis数据是在内存中并采用k-v形式存储,主要原因采用epoll(同步非阻塞)这种io多路复用的调用方式,大量请求(连接) 对应许多文件描述符fd(linux下一切皆文件),大致实现就是通过while(true)循环下遍历这些fd,linux会返回可操作的fd集合(linux内核处理),再拿着它们进行io处理,达到同步非阻塞(linux是无法做到aio异步非阻塞,win可以),相比于linux下select与poll操作,epoll增加了共享空间,就是这些fd以及返回数据在共享空间,在用户态和内核态都可以访问,避免内核态和用户态频繁切换。除了linux,像nignx,java nio(linux)也都用到了epoll。
redis与memcached简单对比
memcached也是kv内存数据库,但是它的value只支持string,那么如果存的是数组,就需要进行解析再生成操作,而redis提供丰富的数据类型并多种操作方法,做到计算向数据自动
场景
缓存…
分布式锁:可以通过redis的nx(如果没有key才会set)命令进行实现并在业务处理完毕后删除这个key,并为它设置一个过期时间避免异常未被释放,需要保证这个过期时间不能比业务时间短不然还没结束其他请求就过来了。此外分布式锁还可以通过数据库(select … for update,然后执行业务,最后commit,需要关闭自动提交),zookeeper实现
redis 的value类型
一些常识,通过help @如list查看相关命令,对于范围,取值正数表示从左往右,负数表示右到左,比如0到-1就代表全部
数值
字符串
list: 双向链表,通过lpush+lpop同方向命令实现栈;通过lpush+rpoo反方向命令实现队列;数组;阻塞队列
hash:hashamp,常用命令 hset,hget,如hset k1 name ‘aaa’
set: 去重集合,常用命令sadd,srem增加删除,可通过smember,spop实现抽奖机制
sorted set:有序排重集合,比方zadd key apple 2 banana 3指定apple的分值为2,banana的分值为3,根据此来进行排序。它的排序实现基于skiplist跳表
bitmap使用:通过bitmap实现指定区间用户的
登录天数,用户id为key,每一个位代表一天;或者统计某个时间段活跃用户,时间为key,每个位代表不同的用户,比通过数据库统计时间空间都大幅提升。 (bitmap位图是redis value的一种类型,可以专门设置位信息,如setbit k1 1 1,就是为k1设置第一位为1。此外还有bitcount统计为1数量,bitops指定字节范围第一个1的位置,bitop 进行与或非操作。)
待补充…