redis 学习总结

114 阅读4分钟

选择缘由:

mysql 关系型数据库慢  内存级别的SAP HANA关系数据库贵

折中方案mysql+redis

redis是键值对存储,存储类型包含以下几种

在centOS系统安装redis 

yum install wget

wget https://download.redis.io/releases/redis-5.0.14.tar.gz
解压:
tar xf redis-5.0.14.tar.gz
编译:
 cd redis-5.0.14 && make
安装:
 make install PREFIX=/opt/ltq/redis5

添加配置保存
 vi /etc/profile
 
 export REDIS_HOME=/opt/ltq/redis5
 export PATH=$PATH:$REDIS_HOME/bin

 source /etc/profile

启动:
 cd cd utils && ./install_server.sh 
查看redis 状态
 service redis_6379 status

一个物理机可以有多个redis实例,通过port区分

可执行程序就一份在目录,但在内存中未来的多实例 ./install_server.sh(执行一次或者多次生成多个实例)

需要各自的配置文件,持久化目录等资源

service redis_6379 start/stop/status   这个是linux /etc/init.d/****文件决定的

ps -fe | grep redis  查看redis进程

redis 是单进程单线程的,使用epoll IO模型

yum install man man-pages 

执行man 2 read 查看read系统调用文档

了解BIO NIO 模型,为什么epoll效率高

redis 数据类型操作

key 包含value的类型 type key查看类型例如string

key中还存储了encoding ,例如string 中包含int raw embstr这几种编码,方便快速运算

使用 Object encoding key 查看对应key的编码

其中bitmap操作 setbit 操作的是0 1 2 3 4 5 6 7    8 9 10 11 12 13 14 15 是字节中位的下标

例如两个字节16bit位 setbit操作的是16bit位对应的下标 setbit 14 1设置 14位置为1

bitcount 统计1的个数 

bitcount k4 0 0 统计第一个字节1的个数 

bitcount k4 1 1 统计第二个字节1的个数

bitcount k4 0 1 统计两个字节1的个数

bitpos   k4 1 0 0 在第一个字节中出现1的 下标+1

bitpos k4 1 0 1 在前两个字节中出现1的 下标+1

bitpos k4 1 1 1  在第二个字节中出现1的 下标+1

bitpos k4 0 1 1 在第二个字节中出现0的 下标+1

 bitop and k1 k2 k3     k2值和k3值进行按位与运算 结果放到k1中

 bitop or k1 k2 k3        k2值和k3值进行按位或运算 结果放到k1中

List: 使用

lpush 从左边放入,取出就是反的,类似栈结构

rpush 从右边放入数据,取出数据就是正常,队列

lindex 通过索引获取数据

lset 通过索引修改对应的值

lrem key count value    删除 key 中的value 的数量

比如lrem k3 2 a   删除k3中value是a 的两个值

linsert key  after/before value  value插入的值

在元素的前或者后面插入值

blpop key time 会读取list中的数据,如果没有就会等待,直到超时时间,如果有多个客户端blpop 会依次读取等待

读取一个空list ,0一直等待不超时

第二个客户端读取

第三个客户端放入数据

可以看到第一个客户端,获取到数据,第二个客户端处于等待

Hash类型操作

对单个属性值进行加减操作

Set 类型操作

求交集

并集

差集

SRANDMEMBER key [count]

count 为正整数:取出一个去重的结果集(不能超过已有集合)

为负数:取出一个带重复的结果集一定满足你要的数量

0:不返回

sort set 类型操作

通过给每个值设置一个score分值来排序

不设置分值默认为1

查看下面操作

取结果包含分值

取分值范围内的数据

取前两个

按分值倒叙取数据

取后面两个

通过value 获取分值score

通过value 获取排名

修改分值

求并集zunionstore  key number(指几个key合并) k1  k2不带权重,默认并集是重复的值score相加

如果给了权重值 对应的value score分值需要乘以权重在相加

求并集也可以取重复的value中最大值,最小值,或者平均值

这里以最大值做个例子

发布订阅功能Pub/Sub

先订阅再发布,才能接收到消息

利用发布订阅解决聊天室消息问题

redis 事务

help @transaction 查看事务帮助文档

先开启事务 ,发送的命令先放入队列,只有遇到exec才会执行

multi
del k1
keys *
exec

如果多个客户端开启事务multi

哪个客户端exec 命令先到达先执行

在事务前先watch k1,后开启事务,如果执行事务时,k1值发生了变化,择事务不执行

防止穿透

直接访问数据库造成访问压力,可以采用各种过滤器,利用bitmap设置标志位

redis 设置过期时间 

 EXPIRE设置多少秒过期

也可以 EXPIREAT 指定时间过期

key的淘汰策略常用有LFU LRU 可以在redis配置文件中配置