Redis知识整理
Posted 无敌仙人掌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis知识整理相关的知识,希望对你有一定的参考价值。
一、缓存知识
1、buffer和cache的区别
Buffer 缓冲 写操作 写缓冲
Cache 缓存 读操作 读缓存 磁盘-->内存-->CPU
2、php的缓存方案
官方文档:http://www.php.net/manual/zh/opcache.installation.php
PHP 5.5.0 及后续版本
OPcache 只能编译为共享扩展。 如果你使用 --disable-all 参数 禁用了默认扩展的构建, 那么必须使用 --enable-opcache 选项来开启 OPcache
推荐的 php.ini 设置
使用下列推荐设置来获得较好的 性能:
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1
3、RAID卡优化
出处:http://www.cnblogs.com/chenmh/p/5846766.html
radi卡电池充放电:http://www.tuicool.com/articles/a2AzAb
1、查看RAID卡电池情况
MegaCli64 -AdpBbuCmd -GetBbuStatus -aAll
如果返回如下错误那么可能是RAID卡BUU电池有问题或者没有电池保护功能:
Adapter 0: Get BBU Status Failed.
FW error description:
The required hardware component is not present.
Exit Code: 0x22
2、查看当前RAID卡缓存策略
MegaCli64 -LDinfo -Lall -aAll Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
第一部分:
WriteBack:写缓存策略
WriteThrough:直接写入磁盘,不适用RAID卡缓存。
第二部分:
ReadAheadNone:不开启预读
ReadAhead:开启预读,在读操作的时候,预先把后面顺序的数据载入raid卡缓存,在顺序读的环境中能提供很好的性能,但是在随机读的环境中反而降低读的性能(适合文件系统,不适合数据库系统)
ReadAdaptive:自适应预读,在缓存和I/O空闲时选择预读,默认策略。
第三部分:
Direct:读操作不缓存到RAID卡缓存。
Cached:读操作缓存到RAID卡缓存。
第四部分:如果BBU(电池)出现问题是否启用Write Cache
No Write Cache if Bad BBU:如果BBU出现问题不使用Write Cache,从WriteBack自动切换到WriteThrough,默认配置。
Write Cache OK if Bad BBU: 如果BBU出现问题仍启用Write Cache,这种配置是非常不安全的,除非是有UPS或者双电源的情况下。
3、RAID卡策略更改
修改WriteBack:
MegaCli64 -LDSetProp -WB -Lall -aAll
修改WriteThrough:
MegaCli64 -LDSetProp -WT -Lall -aAll
修改No Write Cache if Bad BBU:
MegaCli64 -LDSetProp -NoCachedBadBBU -Lall -aAll
修改Write Cache OK if Bad BBU:
MegaCli64 -LDSetProp -CachedBadBBU -Lall -aAll
4.其它相关命令
1 查看机器型号 # dmidecode | grep"Product" 2 3 查看厂商 # dmidecode| grep "Manufacturer" 4 5 查看序列号 # dmidecode | grep "Serial Number" 6 7 查看CPU信息 # dmidecode | grep "CPU" 8 9 查看CPU个数 # dmidecode | grep "Socket Designation: CPU" |wc –l 10 11 查看出厂日期 # dmidecode | grep"Date" 12 13 查看充电状态 # MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Charger Status" 14 15 显示BBU状态信息 # MegaCli64 -AdpBbuCmd-GetBbuStatus –aALL 16 17 显示BBU容量信息 # MegaCli64 -AdpBbuCmd-GetBbuCapacityInfo –aALL 18 19 显示BBU设计参数 # MegaCli64 -AdpBbuCmd-GetBbuDesignInfo –aALL 20 21 显示当前BBU属性 # MegaCli64 -AdpBbuCmd-GetBbuProperties –aALL 22 23 查看充电进度百分比 # MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Relative State of Charge" 24 25 查询Raid阵列数 # MegaCli64 -cfgdsply -aALL|grep "Number of DISK GROUPS:" 26 27 显示Raid卡型号,Raid设置,Disk相关信息 # MegaCli64-cfgdsply –aALL 28 29 显示所有物理信息 # MegaCli64 -PDList-aALL 30 31 显示所有逻辑磁盘组信息 # MegaCli64 -LDInfo -LALL–aAll 32 33 查看物理磁盘重建进度(重要) # MegaCli64 -PDRbld-ShowProg -PhysDrv [1:5] -a0 34 35 查看适配器个数 #MegaCli64 –adpCount 36 37 查看适配器时间 #MegaCli64 -AdpGetTime–aALL 38 39 显示所有适配器信息 #MegaCli64 -AdpAllInfo–aAll 40 41 查看Cache 策略设置 # MegaCli64 -cfgdsply -aALL|grep Polic
二、Redis应用
键值存储,数据结构服务
radis的单线程的;存储在磁盘上的数据仅仅是做为redis重启后能尽快读取数据,而不提过查询;
1、memcache和redis的区别
https://blog.csdn.net/u013474436/article/details/48632665
应用场景
redis key的大小不建议超过2M
先建立h1\\h2 ,然后再建立一个key引用之前的key
2、官方地址和参考博文
官方文档:https://redis.io/
命令参考:https://redisdoc.com/
3、Redis的安装
#yum安装redis
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install redis #查看版本 [root@redis2 ~]# redis-cli -v redis-cli 3.2.10
#备份配置文件
cp /etc/redis.conf{,.orgi}
vim /etc/redis.conf #修改redis主配置文件 cat /etc/redis.conf bind 10.10.10.60 #监听的地址 port 6379 #开启的端口
timeout 0 #按需连接,不需要改 dir /var/lib/redis #数据放置的位置,很重要
logfile /var/log/redis/redis.log 日志存放位置 daemonize no #是否放在后台运行,写yes maxmemory 300M #使用系统多大内存,建议设置 默认最大化使用内存 #重启Redis服务 service start redis
#查看日志 [root@redis2 ~]# tail -f /var/log/redis/redis.log 日志提示操作:sysctl vm.overcommit_memory=1 直接在系统上运行命令即可
检测
[root@redis2 ~]# netstat -luntp|grep redis tcp 0 0 10.10.10.60:6379 0.0.0.0:* LISTEN 22809/redis-server
4、Redis的基础操作
redis是以key-value方法存储的
#连接redis
[root@redis2 ~]# redis-cli -h 10.10.10.60 -p 6379 #如果是远程连接其他redis的方法
10.10.10.60:6379> exit
[root@redis2 ~]# redis-cli #如果监听地址默认是127.0.0.1,这个命令即可连接本机
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
在同一个空间内{类似于数据库}不允许有相同的键存在
127.0.0.1:6379> SELECT 1 #打开一号空间 OK 127.0.0.1:6379[1]> SELECT 2 #打开二号空间 OK 127.0.0.1:6379[2]> SELECT 0 #打开0号空间 OK 127.0.0.1:6379> set yanqi 123 #在零号空间写入一个key OK 127.0.0.1:6379> get yanqi "123" 127.0.0.1:6379> SELECT 1 #切换到1号空间 OK 127.0.0.1:6379[1]> get yanqi #是查询失败的 (nil) 备注:默认只使用0号空间
127.0.0.1:6379> get yanqi "123" 127.0.0.1:6379> SET yanqi 456 NX #key值存在就不更新 (nil) 127.0.0.1:6379> GET yanqi "123" 127.0.0.1:6379> SET yanqi 456 XX #key值存在才更新 OK 127.0.0.1:6379> GET yanqi "456" 127.0.0.1:6379>
4.1、字符串类型
#APPEND 在value后追加字符串 10.10.10.60:6379> get yanqi "1993" 10.10.10.60:6379> append yanqi huang #给key yanqi 追加一个yanqi的字符 (integer) 9 #字符的长度 10.10.10.60:6379> get yanqi "1993huang" #获取字key对应的values字符串的长度 10.10.10.60:6379> STRLEN yanqi #获取key对应values字符的长度 (integer) 9 #INCR 自增,适用于统计 10.10.10.60:6379> INCR yanqi #只对values为数字类型有效 (error) ERR value is not an integer or out of range 10.10.10.60:6379> set www 31 #每查询一次就会在原有的values上加1 OK 10.10.10.60:6379> INCR www (integer) 32 #INCRBY 指定每次递增的步长 redis 10.0.0.10:6379> incrby user 5 (integer) 40 redis 10.0.0.10:6379> incrby user 5 (integer) 45 #DECR 递减 redis 10.0.0.10:6379> DECR user (integer) 54 redis 10.0.0.10:6379> DECR user (integer) 53 #INCRBYFLOAT 支持浮点类型的的递增 #MSET 同时设定多个key的值 MSET key values key2 values key3 values #MGET 同时获取多个key的值 redis 10.0.0.10:6379> mget key1 key2 key3
4.2、散列类型
HSET redis 10.0.0.10:6379> HSET car name bmw (integer) 1 redis 10.0.0.10:6379> HSET car price 500 (integer) 1 redis 10.0.0.10:6379> keys * 1) "key2" 2) "key3" 3) "user" 4) "mykey" 5) "a" 6) "name" 7) "car" 8) "w" 9) "key1" 1.3.2.2 HGET redis 10.0.0.10:6379> hget car name "bmw" redis 10.0.0.10:6379> hget car price "500" #HMSET redis 10.0.0.10:6379> hmset book name redis price 100 auth zhaolaoshi OK 1.3.2.4 HMGET redis 10.0.0.10:6379> hmget book price auth name 1) "100" 2) "zhaolaoshi" 3) "redis" #HGETALL查看键所有的值 redis 10.0.0.10:6379> hgetall book 1) "price" 2) "100" 3) "name" 4) "redis" 5) "auth" 6) "zhaolaoshi" #HDEL 删除对应的键值 redis 10.0.0.10:6379> hdel book price (integer) 1 redis 10.0.0.10:6379> hgetall book 1) "name" 2) "reids" 3) "auth" 4) "zhao" #HEXISTS 判断字段是否存在 redis 10.0.0.10:6379> hexists book name (integer) 1 redis 10.0.0.10:6379> hexists book nam (integer) 0
4.3、列表类型list
#lpush从左边插入数据 redis 10.0.0.10:6379> lpush letter a (integer) 1 redis 10.0.0.10:6379> lpush letter b (integer) 2 #rpush从右边插入数据 redis 10.0.0.10:6379> rpush letter a (integer) 3 redis 10.0.0.10:6379> rpush letter b (integer) 4 redis 10.0.0.10:6379> #LINDEX获取数据 redis 10.0.0.10:6379> LINDEX letter -1 "b" redis 10.0.0.10:6379> LINDEX letter -2 "a" redis 10.0.0.10:6379> LINDEX letter -3 "a" redis 10.0.0.10:6379> lindex letter -4 "b" #RPOP 弹出数据,每弹一个数据,list里就会少一个数据,弹完列表就为空了 redis 10.0.0.10:6379> rpop letter "b" redis 10.0.0.10:6379> rpop letter "a" redis 10.0.0.10:6379> rpop letter "a" redis 10.0.0.10:6379> rpop letter "b" redis 10.0.0.10:6379> rpop letter (nil) #LRANGE 显示范围,从左到右显示。2 代表从左到右第3个数字,-1代表左边第一个数字。 redis 10.0.0.10:6379> LRANGE mylist 2 -1 1) "key3" 2) "key2" 3) "key1 #LLEN 获取list的长度 redis 10.0.0.10:6379> LLEN mylist (integer) 5
4.4、集合类型sets
#SADD 添加一个或多个元素到key中 redis 10.0.0.10:6379> SADD word1 a (integer) 1 redis 10.0.0.10:6379> SADD word1 a b c d (integer) 3 #SREM 删除集合里的元素 redis 10.0.0.10:6379> SREM word1 d (integer) 1 #SMEMBERS 获取集合key里的所有值。 redis 10.0.0.10:6379> SMEMBERS word1 1) "c" 2) "a" 3) "b" #SISMEMBER 判断集合里是否有指定的元素,返回值1为真,0为假 redis 10.0.0.10:6379> SISMEMBER word1 b (integer) 1 redis 10.0.0.10:6379> SISMEMBER word1 bc (integer) 0 #SDIFF 显示差积运算 redis 10.0.0.10:6379> sadd A 1 2 3 (integer) 3 redis 10.0.0.10:6379> sadd B 2 3 4 (integer) 3 redis 10.0.0.10:6379> sdiff A B # 显示A有的 B没有的 1) "1" redis 10.0.0.10:6379> sdiff B A # 显示B有的 A没有的 1) "4" #SINTER 显示交集 redis 10.0.0.10:6379> SINTER A B 1) "2" 2) "3" #SUNION 显示并集(合集) redis 10.0.0.10:6379> SUNION A B 1) "1" 2) "2" 3) "3" 4) "4" #SCARD 显示集合中元素的个数 redis 10.0.0.10:6379> SCARD B (integer) 3 redis 10.0.0.10:6379> SCARD A (integer) 3 #SDIFFSTORE 不显示结果,将结果服务新的集合 语法:SDIFFSTORE newkey key1 key1 redis 10.0.0.10:6379> SDIFFSTORE C A B (integer) 1 redis 10.0.0.10:6379> smembers C 1) "1" redis 10.0.0.10:6379> TYPE C set
4.5、 有序集合类型 sorted sets
#ZADD 添加集合 语法:ZADD key 分数(整数) 值 redis 10.0.0.10:6379> ZADD USER 10 wangfei (integer) 1 redis 10.0.0.10:6379> ZADD USER 1 zhangsan 2 zhsngsi 3 wangfei (integer) 2 #ZSCORE 获取元素的分数 redis 10.0.0.10:6379> ZsCORE USER zhangsan "1" redis 10.0.0.10:6379> ZsCORE USER zhsngsi "2" redis 10.0.0.10:6379> ZsCORE USER wangfei "3" #ZRANGE 指定范围的元素列表 redis 10.0.0.10:6379> ZADD num 1 a 2 b 3 c (integer) 3 redis 10.0.0.10:6379> zrange num 0 -1 1) "a" 2) "b" 3) "c" redis 10.0.0.10:6379> zrange num 0 3 1) "a" 2) "b" 3) "c"
5、redis持久化(persistence)
官方文档地址:一定要看 https://redisdoc.com/topic/persistence.html
将redis内存中的数据放到磁盘中的操作就叫做持久化
5.1、Redis持久化
Redis 提供了多种不同级别的持久化方式:
1、RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
2、AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
注:Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
例如:redis默认使用RDB,使用一段时间后再开启AOF,重启redis进程后数据就没了!!!因为redis重启了就会优先读取AOF文件
如果内存是32G或以上内存,快照过于频繁,需要使用SSD来提高IO性能,因为RDB每次做快照都是上G的内容;也可以拆分成多次redis来跑;
5.2、RDB持久化和AOF持久化的优缺点
https://redisdoc.com/topic/persistence.html
RDB(默认启用)
简单理解:功能更全、执行更快、易于备份(数据可以借助第三方工具分析)
每隔一定时间对内存里的数据做一次备份(做一个快照)。 快照的过程: 1、 fork子进程 2、 父进程继续干活,子进程将内存中的数据写入到硬盘中的临时文件 3、 当子进程写完数据后,用临时文件替换RDB文件。 注:因为rdb文件为压缩文件,比内存中的要小很多;如果需要恢复 1g内容需要30S 当在60S内宕机,就会发生数据丢失的情况。 配置文件/etc/redis.conf 关于RDB的相关配置 ..... 202 save 900 1 # 在900s内,如果有1个键改变就进行快照 203 save 300 10 # 在300s内,如果有10个键改变就进行快照 204 save 60 10000 # 在60s内,如果有10000个键改变就进行快照 ...... dir /var/lib/redis/ # 快照存放地址,如果配置文件没有指定。在哪个目录下启动redis,快照就保存在哪个路径下
AOF
简单理解:数据更全、易于读懂;默认每秒就写一次数据,所以最多就丢失1s的数据
快照的过程: 1、 fork子进程 2、 父进程继续干活,子进程将内存中的数据写入到硬盘中的临时文件 3、 当子进程写完数据后,用临时文件替换AOF文件。 运行中开启AOF模式,立即生效 redis 10.0.0.10:6379> CONFIG SET appendonly yes 配置文件/etc/redis.conf 关于AOF的相关配置 appendonly yes # 默认为no
5.3、RDB 和 AOF ,我应该用哪一个
一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快
5.4、持久化测试
RDB默认是开启的,在配置文件内再把AOF的持久化开启!
[root@redis2 redis]# vim /etc/redis.conf [root@redis2 redis]# systemctl restart redis.service
[root@redis2 redis]# redis-cli -h 10.10.10.60 10.10.10.60:6379> 10.10.10.60:6379> set test01 2000 OK 10.10.10.60:6379> set test02 2002 OK 10.10.10.60:6379> get test01 "2000" 10.10.10.60:6379> exit [root@redis2 redis]#
[root@redis2 redis]# cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 setJSP页面开发知识点整理