选择缘由:
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配置文件中配置