Redis精进笔记

************************基本常识**************

参考网址: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。元素会随机建层,牺牲空间换查询速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值