Redis是一个高性能的key-value数据库,处理数据的效率高。Redis的优点有以下几方面:
- 性能极高:Redis的读取速度是11万次/s,写的速度是8.1万/s。
- 数据类型丰富:Redis相比其他key-value数据库,能够支持很多丰富的数据结构如Strings、Hashes、Lists、Sets和Sorted Sets。
- 原子性:Redis支持事务,能够对所有操作进行原子操作。
- 数据持久化:Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,避免丢失。
Sorted Sets与Sets类似之处是它不允许有重复的成员存在,不同的是每个元素都会关联一个double类型的分数。通过分数,Redis可以对集合中的成员进行从小到大的排序。Sorted Set的成员是唯一的,但是分数却是可以重复的,集合是通过哈希表实现的,因此,对Sorted Set进行添加、删除和查找时的时间复杂度都是O(1)。Sorted Sets中最大的成员数为2^32-1(4294967295,差不多40多亿),score是一个64位浮点类型,范围在-9007199254740992到9007199254740992之间。
有序集合的value可作为时间戳,常用于处理延迟任务(比如多长时间之后数据失效或者触发什么事件)
由于key是唯一的,而每个用户的userId都是唯一的,因此可以用userId作为key来标识,但因为Redis不止一个工程用到,可能其他工程也共用该Redis集群,因此将使用“expose:userId”作为key。因为只保留用户最近两周的曝光数据,所以需要定时去删除两周前的数据,如果当前时间戳作为score,可以调用Redis的zremrangebyscore命令对两周前的数据进行清理。value结构保存用户的曝光具体数据,如内容的id,内容的类型,曝光的时间戳,手机的型号等信息,由于value是字符串类型,因此将这些数据转化成json格式封装。
redis有序集合命令可参考: Redis 命令参考
说一下Redis为什么这么快?
Redis本质上是一个Server,服务器编程的几点常识:
所有命令和请求都有网络开销,都有消耗在网络协议上面(RTT,Round-Trip Time)
当读写(或传输)的数据较多时(比如大对象),带宽就容易成为瓶颈。
再说下Server慢的几个常见因素:
服务端线程数量过多,占据大量资源,频繁切换上下文
锁的滥用,大量CPU用在线程调度上
非必要的内存拷贝
Redis避免了以上方面的问题:
单进程单线程,无锁,串行操作,没有多线程切换和竞争。
数据在内存中(也可持久化),操作迅速
非阻塞IO:采用了epoll + 事件框架。epoll中的读、写、关闭、连接等动作都转化成了事件,然后利用epoll的多路复用特性,不在IO上浪费时间。
Redis在CPU,内存和IO方面都大大提升了效率。
最后再说一个使用的redis命令:
-x 表示从标准输入(stdin)读取数据
cat file.txt | redis-cli -p 6379 -x set key
redis-cli -p 6379 -x set key 0<file.txt
以上两种方式结果相同。更多命令选项请参考redis-cli --help.