************************基本常识**************
参考网址:https://db-engines.com
官网:http://reios.cn
*************************************安装********************************
1、进入官网
2、download
3、解压:tar xf *******(此处不加参数v,减少io回流)
4、进入源文件目录下
5、看README文件,里面有安装说明和使用说明
(一般要安装gcc:开源linux下的c语言编译软件)
6、加入服务
1)安装:make install prefix=/opt/rain/redis
2)编辑/etc/profile环境变量文件,export REDIS_HOME=/opt/rain/redis
export PATH=$PATH:$REDIS_HOME/bin
3)执行source /etc/profile
4)执行redis源目录下的utils/install_server.sh,指定端口号,每个端口号会生成独立的配置文件和日志文件。可以生成并启动多个不同端口的redis服务。
7、查看:ps -fe | grep redis
为什么要用缓存:
当数据库存储数量越来越大的时候,随着并发量的增加,增删改查都会变的很慢,这时候就需要把部分数据放入内存中,以加快访问速度,这就引出了缓存的概念。
Redis操作速度:1.5M/s,在内存中操作,是纳秒级寻址,可达到秒级百万数据操作
Radis 的value值有五种类型:如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
为什么快?:使用内存;使用KV方式;每种VALUE类型有自己的本地方法;工作线程是单线程(串行);6.x开始使用IO多线程
集合会导致其它用户等待时间较长,所以应该少用集合或把集合操作分配到其它服务器或空间操作
为什么Redis优于memchache?
memcache的value类型只有string类型,所以当存储一个数组的话,必须要全量取出,取出到本地解析。所以增加了io成本、网络传输、编码成本。如存储了[1,2,3,4,5],本来只想取2,但因为是string类型,所以必须把1,2,3,4,5全部取到本地转换成数组后再取出2。
*********************************************原理***************************************
一、 IO读写发展过程:
1、阻塞式阶段:block
2、同步 非阻塞 阶段:
3、多路复用NIO阶段:
4、epoll阶段:
nginx也使用多路复用,如下图:
文件的网卡输出可以使用零拷贝sendfile,文件不经过系统内核,直接把文件通过网卡输出。如kafka就是这个原理,所以kafka很快。
二、redio运行原理:
*******************************************秒杀场景分析:******************************
进一步提升性能的话,如下图,分治:
*******************************************************************************************
目前的IO操作还没有异步IO(AIO),只有同步IO(阻塞IO、非阻塞IO、多路复用)
*****************************Redis三高架构,解决 雪崩 穿透 击穿 预热问题***********************
Redis不要做主从复制,而是在数据库之前做好分布式锁,等待Redis重新启动。
Redis分布式单机锁(存在可用性问题)处理访问的lua语句:
Redis分布式红锁RedLock(解决了可用性问题):
*********************************string类型*********************
也可以写成Byte类型
参数:set key value [expiration EX seconds|PX milliseconds] [nx|xx]
nx:创建key。抢锁的场景可用。
xx:只能更新。
其它命令:APPEND、SETRANGE、GETRANGE、STRLEN……
二进制安全
Redis中存储的数据为了防止溢出,都采用字节存储。
使用OBJECT encoding k2 进行编码转换,如果原来k2是数字型,操作之后下次可以使用INCRBY 直接进行计算,提高效率
getset:取值同时进行设置,可减少一次传输和IO,提高效率
一个字节有8个二进制位
SETBIT:设置字节数
*****************************bitmap用途*******************************
需求1解决方案:如下图 。使用关系型数据库查询慢,占资源多,效率低。
需求2解决方案:如下
如果统计出来去年有多少活跃用户就可以算出大概礼物数量。
字符集编码:
*********************************list类型*********************
栈结构
*********************************list类型*********************
类似数组操作,值可重复,可作为栈使用,也可以作为队列使用。
*********************************hash类型*********************
hash可作为表使用。
举例,没有hash的情况下,没有数据库情况下,存储用户数据:
但使用hash的话:可如下使用
可对数字进行加减
*********************************set类型*********************
无序。不重复。可进行交并差集
查看命令:help @set
获取集合内随机内容:srandmember key count
count 为0,不返回;为正数且小于数据量,则返回不重复值;为负数且小于数据集,则返回满足数量的重复值。
使用场景:抽奖
*********************************sorted_set类型*********************
数据去重且可排序。内存中是左小右大的排列方式。
含元素、分值、正负索引。
分值相同的情况下,默认按名称排序。
查看命令:help @sorted_set
从大到小取出
问题:它底层是如何实现的:skip list。元素会随机建层,牺牲空间换查询速度。