一、redis特性
1、速度快 10w QPS
数据存放在内存,C语言实现,单线程
2、持久化
Redis所有数据保存在内存中,但是对数据的更新将异步地保存在磁盘上。
3、多种数据结构
列表
哈希
集合
有序集合
字符串
位图 :BitMaps
HyperLogLog:超小内存唯一值计数 12K 计算用户唯一值
GEO:地理信息定位
4、支持多种编辑语言
Java,Python,php,Ruby……
5、功能丰富
发布订阅,事务,pipeline
6、简单
源码较短 23000 lines ; 不依赖外部库;单线程模型;
7、主从复制
8、高可用,分布式
二、redis使用场景
1、缓存系统
网站设置缓存,可以提高响应速度;
2、计数器
如之前爬虫爬取网站次数的应用;有incr方法,加1
3、消息队列
4、排行榜
之前做的一个搜索引擎项目,可以对当前热搜进行查询
5、社交网络
6、实时系统
垃圾邮件处理系统
三、linux下安装:
$ wget http:/ /download. redis. io/releases/redis-3.0.7.tar.gz
$ tar xzf redis-3.0.7.tar.gz
$ ln -s redis-3.0.7 redis
$ cd redis
$ make
$ make install .
1)下载Redis指定版本的源码压缩包到当前目录。
2)解压缩Redis源码压缩包。
3)建立一个redis目录的软连接,指向redis-3.0.7。
4)进入redis目录。.
5)编译(编译之前确保操作系统已经安装gcc
6)安装。
四、三种启动方法
1、默认配置
redis-server,使用默认配置启动
2、动态参数启动
redis-server --port 6380 :6380端口启动
3、配置文件启动
redis-server config,生产环境建议配置启动
常用配置:
五、API的理解和使用
1、通用命令
keys 遍历所有key 时间复杂度:O(n)
dbsize 数据库大小,算出key的总数 时间复杂度:O(1)
exists key 判断一个key是否存在 时间复杂度:O(1)
del key 删除指定的 key-value 时间复杂度:O(1)
expire key seconds 过期时间 ttl 查看key剩余的过期时间 persist:去掉过期时间 时间复杂度:O(1)
type key 返回key的数据类型 时间复杂度:O(1)
2、数据结构和内部编码
type命令实际返回的就是当前键的数据结构类型, 它们分别是:
string(字符串) 、 hash(哈希) 、 list(列表) 、 set(集合) 、 zset(有序集合) ,
但这些只是Redis对外的数据结构,实际上每种数据结构都有自己底层的内部编码实现, 而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。
3、单线程结构
不会同时执行两条命令
redis单线程为什么这么快?
1、纯内存访问,内存的响应时间大约为100ns。
2、非阻塞IO,redis使用epoll作为I/O多路复用技术的实现。
3、避免线程切换和竞态消耗(简化实现,避免多线程竞争)。
注意:一次只能执行一条命令;拒绝长命令(keys *);
4、API
常用函数:
https://blog.csdn.net/T_I_A_N_/article/details/95660323
1、字符串
字符串value不能大于512MB,一般用不了。
场景:缓存,计数器、分布式锁……
天然适合作为计数器,因为redis是单线程,不会产生竞争问题。
2、哈希
h开头
几乎所有的编程语言都提供了哈希(hash) 类型, 它们的叫法可能是哈希、 字典、 关联数组。 在Redis中, 哈希类型是指键值本身又是一个键值对结构, 形如value={{field1, value1}, ...{fieldN, valueN}}。
3、列表
特点:有序,可重复,左右两边可以插入删除
L开头
使用场景:消息队列、文章列表
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
4、集合
特点:无序,无重复元素,集合间操作,一个集合最多可以存储 个元素。除了支持集合内的增删改查,还支持多个集合间取交集,并集,差集。
S
场景:抽奖,放在集合中,使用spop随机弹出一个;标签,给用户添加标签;共同关注
5、有序集合
保留了集合不能有重复成员的特性,但是有序集合中的元素可以排序。有序集合中的元素不能重复,但是分数可以重复。
Z开头
场景:排行榜
六、redis其他功能
1、慢查询
生命周期:
(1)慢查询发生在第3阶段;
(2)客户端超时不一定慢查询,但慢查询是客户端超时的一个潜在因素。
两个配置:
(1)slowlog-max-len :队列长度,慢查询入队。
(2)slowlog-log-slower-than:慢查询阈值(微秒)
三个命令:(1)slowlog get [n] :获取慢查询队列
(2)slowlog len:获取慢查询队列长度
(3)slowlog reset:清空慢查询队列。
2、pipeline
redis客户端执行一条命令分为如下四个过程:
- 发送命令
- 命令排队
- 命令执行
- 返回结果
其中1和4称为往返时间。redis提供了批量命令操作,有效减少往返时间。
redis的命令时间是微秒级别。执行命令速度快,受网络限制。
注意:
(1)注意每次携带量
(2)pipeline只能作用在一个redis结点上。
3、发布订阅
角色: 发布者、订阅者、频道
publish(发布)
#发布消息 publish channel message
subscribe(订阅)
subscribe [channel] #一个或多个 unsubscribe [channel] #取消订阅
使用场景:
聊天室、公告牌。
4、Bitmaps (位图)
redis可以操作位。
127.0.0.1:6379> set tian mingbo OK 127.0.0.1:6379> getbit tian 0 (integer) 0 127.0.0.1:6379> getbit tian 1 (integer) 1 127.0.0.1:6379> setbit tian 1 0 (integer) 1 127.0.0.1:6379> get tian "-ingbo" 127.0.0.1:6379>
场景:用户统计
使用1位代表一个用户,可以节省内存(并不是绝对好,当数据大时)
假设网站有1亿用户,每天独立访问的用户有5千万,如果每天用集合类型和Bitmaps分别存储活跃用户可以得到下图。
5、hyperloglog :极小空间完成独立数量统计,本质还是字符串
三个命令:
(1)pfadd key element [element] 向hyperloglog添加元素
(2)pfcount key [key...]: 计算hyperloglog的独立总数
(3)pfmerge destkey sourcekey [sourcekey ...]: 合并多个hyperloglog
存在一定的误差率,官方给出的误差率是0.81%。
6、GEO
地理信息定位:存储经纬度,计算两地距离,范围计算等。
API:
geoadd key longitude latitude member [longitude latitude member] #经度,纬度 ,标识
geopos key member [member ...] #获取地理位置信息
geodist key member1 member2 #获取两个位置的距离