记一下一些redis的内容,以免自己忘记。
根据redis的GitHub上的说明:Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis默认在6379端口运行
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。在使用方面上来说,redis在缓存数据方面功能十分强大,redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。但是redis会狂吃你的系统内存,
有鉴于此 redis有一套完整且良好的
缓存清理策略:
这几个清理策略需要结合实际的内存需求进行选择,此处不讲具体业务情况。至于redis的安装也很简单centos,Ubuntu都能在线install 至于windows个人觉得安装没什么意义,没有哪台服务器会用Windows的作缓存服务器吧。。有需要的话可以去:
redis官网 上下载。接下来是关于redis的一些基础
1.关于redis的数据类型:
首先再次强调一下redis是key-value类型的nosql db。String类型在redis中以二进制安全形式存在,什么意思?这意味着你可以存放任何类型数据只要在redis String的存储大小内(512M)无论是存网页地址,音频文件,视频文件,图片等都是允许的。
对应的操作也有很多很多 ,进入redis: 安装好redis后,命令:redis-cli进入redis:如果有中文乱码的话,请查看下是不是下的32位的?或者 redis-cli --raw进入
关于String
这里有必要说一下关于TTL返回的数据代表的内容:key 不存在时,返回 -2 (早期版本是-2 现在是-1,如果你用的是redis2.8以上的就忽略这个 不会返回-2 不存在或者未设置都是-1); key 存在但是没设置超时时间,返回的是-1 这意味着永不过期,而且:当内存满了以后,找不到能够删除的值时redis会拒绝的所有的写操作,很糟糕的。。。
关于Hash:
关于hash:hash是一个string类型的field和value的映射表。hash类型特别适合用于存储对象。在field的数量在限制的范围内以及value的长度小于指定的字节数,那么此时的hash类型是用zipmap存储的,所以会比较节省内存。可以在配置文件里面修改配置项来控制field的数量和value的字节数大小。需要提到的是:这两个配置并不是限制hash结构最多只能存多少个field以及value的最大字节数,而是说在field未超过配置的数量,而且每一个filed对应的value的长度都小于指定的字节数时,注意是两个条件都满足时,该key的存储是采用的zipmap,就是压缩了的数据,节省空间。当field的数量超过了,或者其中有value的长度大于指定的长度,那么整个key就会采用正常的hash结构来在内存中存储。可以考虑用String存储对象的json信息也可以用hash存储序列化的对象信息,具体考虑情况和需求。
hash-max-zipmap-entries 512 #配置字段最多512个
hash-max-zipmap-value 64 #配置value最大为64字节。
必须满足以上两个条件,那么该key会被压缩。否则就是按照正常的hash结构来存储hash类型的key。
根据redis官方说法:每个hash可以存储Every hash can store up to 2^32 - 1 field-value pairs (more than 4 billion).
关于List:
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
关于List:当PUSH进redis中的list时list会增加长度,由于list也支持存储很大的数据所以,可以存放这样的数据List<T> 当然T也只支持String型,对象的json格式、
关于set:
是string类型数值的无序集合。set元素最大可以包含2的32次方减1个元素。这个插入的时间复杂度稍高 是o(n) (这里需要注意一点 redis2.4版本只支持单个插入 所以时间复杂度是0(1)的 这里指的是之后的版本) list也是o(n) 插n个数据时间复杂度未n,String的是o(1)很明显。。
关于set:
我们都知道set中存储的是唯一的数据,故此set常被用于存储一些唯一的内容{比如一个对象于另一个实体的关联比如内容的id字段等,发帖回帖中的评论id等};
关于sorted set:
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
时间复杂度:O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量。
下面是网上的一位老哥说的话,感觉和jdk8中的HashMap有点相似的地方(我指的是思想)。
redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化。所以如上可知:
添加和删除都需要修改skiplist,所以复杂度为O(log(n))。
但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1)
其他的range操作复杂度一般为O(log(n))
当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)
关于sorted set:
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。所以用于存储那种统计后的排行很好。
原文:https://www.cnblogs.com/notably/p/11129322.html