博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存知识整理(包含Redis)
阅读量:6005 次
发布时间:2019-06-20

本文共 13993 字,大约阅读时间需要 46 分钟。

一、缓存知识

  1、buffer和cache的区别

      Buffer 缓冲 写操作 写缓冲

        Cache 缓存 读操作 读缓存 磁盘-->内存-->CPU

  2、PHP的缓存方案

官方文档:

PHP 5.5.0 及后续版本
OPcache 只能编译为共享扩展。 如果你使用 --disable-all 参数 禁用了默认扩展的构建, 那么必须使用 --enable-opcache 选项来开启 OPcache
推荐的 php.ini 设置
使用下列推荐设置来获得较好的 性能:

opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1opcache.enable_cli=1

 

  3、RAID卡优化

出处:

radi卡电池充放电:

  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 -aAllDefault Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBUCurrent 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
View Code

 

 

 二、Redis应用

键值存储,数据结构服务

radis的单线程的;存储在磁盘上的数据仅仅是做为redis重启后能尽快读取数据,而不提过查询;

  1、memcache和redis的区别

简单的区别

 

 应用场景

redis key的大小不建议超过2M

先建立h1\h2 ,然后再建立一个key引用之前的key

 

  2、官方地址和参考博文

官方文档:命令参考:

  3、Redis的安装

#yum安装redis wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum -y install redis#查看版本[root@redis2 ~]# redis-cli -vredis-cli 3.2.10 #备份配置文件 cp  /etc/redis.conf{,.orgi} vim /etc/redis.conf#修改redis主配置文件cat /etc/redis.confbind 10.10.10.60  #监听的地址port 6379  #开启的端口 timeout 0  #按需连接,不需要改dir /var/lib/redis   #数据放置的位置,很重要 logfile /var/log/redis/redis.log  日志存放位置daemonize no  #是否放在后台运行,写yesmaxmemory 300M   #使用系统多大内存,建议设置默认最大化使用内存#重启Redis服务service start redis
#查看日志[root@redis2 ~]# tail -f /var/log/redis/redis.log日志提示操作:sysctl vm.overcommit_memory=1  直接在系统上运行命令即可

 检测

[root@redis2 ~]# netstat -luntp|grep redistcp 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   #打开一号空间OK127.0.0.1:6379[1]> SELECT 2  #打开二号空间OK127.0.0.1:6379[2]> SELECT 0  #打开0号空间OK127.0.0.1:6379> set yanqi 123    #在零号空间写入一个keyOK127.0.0.1:6379> get yanqi"123"127.0.0.1:6379> SELECT 1   #切换到1号空间OK127.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值存在才更新OK127.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 range10.10.10.60:6379> set www 31   #每查询一次就会在原有的values上加1OK10.10.10.60:6379> INCR www(integer) 32#INCRBY 指定每次递增的步长redis 10.0.0.10:6379> incrby user 5(integer) 40redis 10.0.0.10:6379> incrby user 5(integer) 45#DECR 递减redis 10.0.0.10:6379> DECR user(integer) 54redis 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、散列类型

HSETredis 10.0.0.10:6379> HSET car name bmw(integer) 1redis 10.0.0.10:6379> HSET car price 500(integer) 1redis 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    HGETredis 10.0.0.10:6379> hget car name"bmw"redis 10.0.0.10:6379> hget car price"500"#HMSETredis 10.0.0.10:6379> hmset book name redis price 100 auth zhaolaoshiOK1.3.2.4    HMGETredis 10.0.0.10:6379> hmget book price auth name1) "100"2) "zhaolaoshi"3) "redis"#HGETALL查看键所有的值redis 10.0.0.10:6379> hgetall book1) "price"2) "100"3) "name"4) "redis"5) "auth"6) "zhaolaoshi"#HDEL 删除对应的键值redis 10.0.0.10:6379> hdel book price(integer) 1redis 10.0.0.10:6379> hgetall book1) "name"2) "reids"3) "auth"4) "zhao"#HEXISTS 判断字段是否存在redis 10.0.0.10:6379> hexists book name(integer) 1redis 10.0.0.10:6379> hexists book nam(integer) 0
View Code

 

  4.3、列表类型list

#lpush从左边插入数据redis 10.0.0.10:6379> lpush letter a(integer) 1redis 10.0.0.10:6379> lpush letter b(integer) 2#rpush从右边插入数据redis 10.0.0.10:6379> rpush letter a(integer) 3redis 10.0.0.10:6379> rpush letter b(integer) 4redis 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 -11) "key3"2) "key2"3) "key1#LLEN 获取list的长度redis 10.0.0.10:6379> LLEN mylist(integer) 5
View Code

 

  4.4、集合类型sets

#SADD 添加一个或多个元素到key中redis 10.0.0.10:6379> SADD word1 a (integer) 1redis 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 word11) "c"2) "a"3) "b"#SISMEMBER 判断集合里是否有指定的元素,返回值1为真,0为假redis 10.0.0.10:6379> SISMEMBER word1 b(integer) 1redis 10.0.0.10:6379> SISMEMBER word1 bc(integer) 0#SDIFF 显示差积运算redis 10.0.0.10:6379> sadd A 1 2 3  (integer) 3redis 10.0.0.10:6379> sadd B 2 3 4(integer) 3redis 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 B1) "2"2) "3"#SUNION 显示并集(合集)redis 10.0.0.10:6379> SUNION A B1) "1"2) "2"3) "3"4) "4"#SCARD 显示集合中元素的个数redis 10.0.0.10:6379> SCARD B(integer) 3redis 10.0.0.10:6379> SCARD A(integer) 3#SDIFFSTORE 不显示结果,将结果服务新的集合语法:SDIFFSTORE newkey key1 key1redis 10.0.0.10:6379> SDIFFSTORE C A B(integer) 1redis 10.0.0.10:6379> smembers C1) "1"redis 10.0.0.10:6379> TYPE Cset
View Code

  4.5、 有序集合类型 sorted sets

#ZADD 添加集合语法:ZADD key 分数(整数) 值redis 10.0.0.10:6379> ZADD USER 10 wangfei(integer) 1redis 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) 3redis 10.0.0.10:6379> zrange num 0 -11) "a"2) "b"3) "c"redis 10.0.0.10:6379> zrange num  0 31) "a"2) "b"3) "c"
View Code

 

  

  5、redis持久化(persistence)

官方文档地址:一定要看 

 

将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.6010.10.10.60:6379> 10.10.10.60:6379> set test01 2000OK10.10.10.60:6379> set test02 2002OK10.10.10.60:6379> get test01"2000"10.10.10.60:6379> exit[root@redis2 redis]# [root@redis2 redis]# cat appendonly.aof *2$6SELECT$10*3$3set$6test01$42000*3$3set$6test02$42002[root@redis2 redis]#

 

  5.5、恢复测试

 

  6、主从复制

数据量非常大的时候,建议晚上添加从服务

主机IP 角色
10.10.10.60 主库
10.10.10.59 从库

 

 

 

    6.1、准备两台redis设备

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install redis service redis restart systemctl enable redis.service tail -f /var/log/redis/redis.log 显示sysctl vm.overcommit_memory=1
service redis restart
修改主配置文件/etc/redis.conf [root@redis2 ~]# redis-cli -h 10.10.10.6010.10.10.60:6379> info Replication# Replicationrole:masterconnected_slaves:0master_repl_offset:7535repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:753410.10.10.60:6379>[root@redis1 ~]# redis-cli -h 10.10.10.5910.10.10.59:6379> info Replication# Replicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:010.10.10.59:6379>

 

注释:两个配置一样,只是监控的IP地址不一样;只修改了监听IP地址、开启AOF、查看了数据的备份目录;其他均为修改!!!

1 [root@redis1 ~]# egrep -v "$^|#" /etc/redis.conf  2 bind 10.10.10.59 3 protected-mode yes 4 port 6379 5 tcp-backlog 511 6 timeout 0 7 tcp-keepalive 300 8 daemonize yes 9 supervised no10 pidfile /var/run/redis_6379.pid11 loglevel notice12 logfile /var/log/redis/redis.log13 databases 1614 save 900 115 save 300 1016 save 60 1000017 stop-writes-on-bgsave-error yes18 rdbcompression yes19 rdbchecksum yes20 dbfilename dump.rdb21 dir /var/lib/redis22 slave-serve-stale-data yes23 slave-read-only yes24 repl-diskless-sync no25 repl-diskless-sync-delay 526 repl-disable-tcp-nodelay no27 slave-priority 10028 appendonly yes29 appendfilename "appendonly.aof"30 appendfsync everysec31 no-appendfsync-on-rewrite no32 auto-aof-rewrite-percentage 10033 auto-aof-rewrite-min-size 64mb34 aof-load-truncated yes35 lua-time-limit 500036 slowlog-log-slower-than 1000037 slowlog-max-len 12838 latency-monitor-threshold 039 notify-keyspace-events ""40 hash-max-ziplist-entries 51241 hash-max-ziplist-value 6442 list-max-ziplist-size -243 list-compress-depth 044 set-max-intset-entries 51245 zset-max-ziplist-entries 12846 zset-max-ziplist-value 6447 hll-sparse-max-bytes 300048 activerehashing yes49 client-output-buffer-limit normal 0 0 050 client-output-buffer-limit slave 256mb 64mb 6051 client-output-buffer-limit pubsub 32mb 8mb 6052 hz 1053 aof-rewrite-incremental-fsync yes54 [root@redis1 ~]#
大部分都是默认配置

 

 

  6.2、设置10.59为从库

有两种设置方法:(其实就是在要设置成从库的redis上执行 slaveof  IP port

      1、在主配置文件内添加:   slaveof  10.10.10.60  6379      #

      2、在命令中执行:slaveof  10.10.10.60  6379   #重启后命令丢失,需从新执行

[root@redis1 ~]# redis-cli -h 10.10.10.5910.10.10.59:6379> slaveof  10.10.10.60  6379  #指向主库OK10.10.10.59:6379> info Replication# Replicationrole:slave     #由master变为了slavemaster_host:10.10.10.60   #主库的IP地址master_port:6379   #主库的端口master_link_status:up     #当前的状态,是UP的master_last_io_seconds_ago:3master_sync_in_progress:0slave_repl_offset:8725slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:010.10.10.59:6379>

 主库显示如下:

 

 测试:就是在主库上set一个key,再到salve中get这个key,现在正常即可!!!

    6.3、主从切换

当主库down机后需要提升从库为主库,执行一条命令!

 

  7、reid集群

1、客户端分片  将Redis分片的工作放在业务程序端(最可靠的方法)

优点:实现方法和代码全部自己掌控,随时调整

缺点:手动迁移数据

 

2、Redis Cluster

缺点:客户端实现很少

 

 

3、代理分片:类似 mysql Proxy:twemproxy 

缺点:不知道数据存在哪,生产基本不用!!!

  

tidb

 

 Codis 优点:(第二种选法)

  1、无缝迁移数据

  2、有动态扩容和缩容的能力

    缺点:

  1、单线程

  2、部分命令不支持:

 

转载于:https://www.cnblogs.com/huangyanqi/p/9210583.html

你可能感兴趣的文章
Python标示符命名规则
查看>>
SSL certificate problem unable to get local issuer certificate解决办法
查看>>
node.js中使用http模块创建服务器和客户端
查看>>
11.表达式语言
查看>>
3.数据校验和SpringEL
查看>>
面向对象编程-何为对象
查看>>
android以json形式提交信息到服务器
查看>>
最短最优升级路径(完美世界2017秋招真题)
查看>>
【PHP基础】错误处理、异常处理
查看>>
Android之drawable state各个属性详解
查看>>
android开发(22)使用正则表达式 。从一个字符串中找出数字,多次匹配。
查看>>
AJAX
查看>>
2015 多校联赛 ——HDU5334(构造)
查看>>
mysql字符集
查看>>
DP_1d1d诗人小G
查看>>
非、半、结构化数据学习【转载】
查看>>
avalon加载一闪而过现象
查看>>
Python学习第二天-编写购物车
查看>>
BigTable——针对结构型数据的一种分布式存储系统
查看>>
python调用c/c++写的dll
查看>>