Redis

Redis基本操作

 

set key value 值  存入值

get key 获取值 没有返回nil

help  帮助命令

 

redis数据类型

String -->java String

hash   --> HashMap

list       --> LinkedList

set       --> HashSet

sorted_set  --> TreeSet

String 类型的基本操作

set key value 值  存入值

get key   获取值 没有返回nil

del key    删除key 删除成功返回1  失败0

mset key value ..  存入多个

mget key key ...    取出多个

strlen key       获取字符串的长度

append key value    追加到key 没有就新建 有追加 返回追加后的长度

incr key 加一

decr key 减一

incrby key 值 指定key加多少

decrby key 值  指定key减多少

incrbyfloat key zhi  指定key 加多少 float类型

注意: 使用incrby key 当值是负数 会做出相减操作 decrby 使用负数 相加

setex key time value  设置有效期

String 类型数据操作的注意事项:
  1. 数据最大存储量512MB

  2. 数值计算最大的范围(92233772036854775807)

  3. nil 等同于null

set user🆔1:name lvsheng   理解为 uset表id为1的字段 name属性的值为lvsheng

hash基本操作

hset key field 值   添加一条

hget key field   获取值

hgetall key             获取所有

hmset key  field1 value1 field2 value2 ... 添加多个

hmget key field1 field2...                          获取多个

hlen key                      查看有多少个属性

hexists key field1  查看key当中是否有field1

hkeys key             获取key的所有的field1

hvals  key              获取key所有的values

hincrby key field1 1  key的field1的value加一

hsetnx key field value  如果在key有fieid 就不会set 没有就set

hash注意事项
  1. hash类型下的value只能存储字符串, 不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,
    对应的值为(nil)

  2. 每个hash可以存储232- 1个键值对

  3. hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存
    储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用

  4. hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,何能成为数据访问
    瓶颈

list基本操作

lpush key val           左插入

lrange key  start stop                 左读取 strart 从stop如果不知道list有多少个 stop写-1即可

lindex key  index       指定的索引

llen key                获取key的长度

lpop key            移除左边第一个

rpop key            移除右边第一个

blpop key timeout         如果list没有数据 会等待 单位是秒

lrem key count  value    删除  count 删几个  value 删除哪个value

set数据类型的基本操作

sadd key value ....   添加

smembers key   查看所有的值

srem key value  删除

scard key   数据的总和

sismember key value 是否存在数据

srandmember key  count  随机的取数据 count 是取几个,不会改变源数据

spop key  随机取出数据 会把取出的数据,到源数据删除

sunion key key1 吧两个set合并

sinter key key1 把两个set相同的数据

set类型数据操作的注意事项
  1. set 类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一-份
    2

  2. set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

sorted_set类型基本操作

zadd key value  member1     value  是要排序值  member1是字段

zrange key 0 -1 withscores      显示奇数行是字段 偶数行是数据 按照从小到大的顺序排序  withscores显示字段和数据 不加 只显示字段

zrevrange key 0  -1   按照从大到小的顺序排序 只显示字段

zrem key 字段  删除

zrangebyscore key  min max    查询值在min 和 max 之间的

zrevrangebyscore key max min      相反

zremrangebyscore key  min max       删除min和max之间的

zremrangebysrank key start stop     删除索引 start 到 stop

zcard key 总数的和

zcount key min max   指定范围的总数

zrank key 字段   查看字段排在第几   从小到大的排序

zrevrank key 字段  查看字段排在第几   从大到小的排序

zscore key 字段      查看字段的

zincrby key  1 字段      字段的值加1

 

sorted_ set类型数据操作的注意事项
  1. score保存的数据存储空间是64位,如果是整数范围是9007199254740992~9007199254740992

  2. score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时
    候要慎重

  3. sorted set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反
    复覆盖,保留最后一次修改的结果

 

通用指令

key通用操作

del key   删除key

exists key  查看key是否存在

type  key   查看key 的类型

flushdb  于清空当前数据库中的所有 key。

key的扩展操作

expire key   3   设置key 3秒 有效期

pexpire key 3    设置key 3毫秒 有效期

expireat key    时间戳

pexpireat key   时间戳

ttl key   存在返回-1 不存在-2

persist key  把key的有效期 转换永久性

keys * 查看所有的key

rename key newkey  为key修改名字 如果修改之后的值有 会覆盖

renamenx key newkey 不会覆盖

select 2       切换到2数据库

move key db   移动数据

dbsize 看库中有多少个key

 

Linux环境安装redis

wget http://download.redis.io/releases/redis-4.0.0.tar.gz  下载安装包

tar -xvf redis-4.0.0.tar.gz 解压

进入redis-4.0.0目录执行

make install

RDB 相关配置

save 永久保存

save 相关配置

dbfilename dump.rdb 设置存储数据的名称  通常设置dump-端口号.rdb

dir  存放.rdb的路径   通常目录名称data

rdbcompression yes  是否用压缩 通常会打开

rdbchecksum yes  设置是否进行校验  通常默认开启状态

注意: save会阻塞redis 不建议线上使用

bgsave 后台保存

bgsave 工作原理:
  发送指令--->返回消息Backgrund saving started ----> 调用fork函数生成子线程

RDB自动保存

save 监控时间范围 监控key变换量

save  100  10  在100秒内 执行10个key的变换

AOF写数据的三种策略

always  (每次)   每次写入操作同步AOF文件中,数据零误差,性能较低

eveysec (每秒)  每秒将缓冲区的指令同步AOF文件中,数据准确性高,性能较高 可能丢失1秒内的数据

no(系统控制)   整体过程不可控 (由系统控制)

Redis事务

multi  开启测试

exec   执行事务

discard  取消事务

watch key ...   给key加锁

unwatch   取消锁的监视

分布式锁

setnx  lock-key value  加锁

del lock-key  释放锁

expire lock-key 20  设置锁的超时时间 20秒没删除锁 自动删

删除过期数据

定时删除

    创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
  优点:节约内存,到时就删除,快速释放掉不必要的内存占用
  缺点: CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量

  用处理器性能换取存储空间

惰性删除

  数据到达过期时间,不做处理。等下次访问该数据时
  如果未过期,返回数据
  发现已过期,删除,返回不存在

   在获取key的操作 都会执行expirelfNeeded()->检查数据是否过期

  优点:节约CPU性能,发现必须删除的时候才删除
  缺点:内存压力很大,出现长期占用内存的数据

逐出算法

  Redis使用内存存储数据,在执行每一个命令前,会调用freeMemorylfNeeded()检测内存是否充足。 如
果内存不满足新加入数据的最低存储要求,redis要临时删除-些数据为当前指令清理存储空间。清理数据
的策略称为逐出算法。

  maxmemory   最大可使用内存

  maxmemory-samples  每次选取待删除数据的个数

  maxmemory-policy  删除策略

 

 

影响数据逐出的相关配置
●检测易失数据(可能会过期的数据集server.db[i].expires )
①volatile-lru: 挑选最近最少使用的数据淘汰
②volatile-lfu: 挑选最近使用次数最少的数据淘汰
volatile-ttl:挑选将要过期的数据淘汰
④volatile-random: 任意选择数据淘汰
●检测全库数据(所有数据集server.db[j.dict)
⑤alkeys-Iru: 挑选最近最少使用的数据淘汰
⑥allkeys-lfu: 挑选最近使用次数最少的数据淘汰
⑦allkeys-random: 任意选择数据淘汰
●放弃数据驱逐
⑧no-enviction (驱逐) :禁止驱逐数据(redis4.0中默认策略) ,会弓|发错误OOM (OutOf Memony)
maxmemory-policy volatile-lru

 

redis.conf配置

服务器配置

服务器端设定
●设置服务器以守护进程的方式运行
daemonize yes Ino
●绑定主机地址
bind 127.0.0.1
●设置服务器端口号
port 6379
●设置数据库数量
databases 16

客户端配置
●设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
maxclients 0
●客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为0
timeout 300

多服务器快捷配置
●导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护
include /path/server -端口号.conf

 

高级数据

HyperLogLog类型的基本操作
●添加数据
pfadd key element [element .. .]
●统计数据
pfcount key [key .. .]
●合并数据
pfmerge des tkey sourcekey [sourcekey. .. ]

 

GEO类型的基本操作
●添加坐标点
geoadd key longitude lati tude member [1ongi tude latitude member ...]
●获取坐标点
geopos key member [member . ..]
●计算坐标点距离
geodist key memberl member2 funit]

 

主从复制

方式一:

开了2个redis服务端 一个6379 一个6380 (端口)

使用了一个客服端连上了6380的服务端

执行了slaveof 127.0.0.1 6379  用6380练6379 做它的从机

方式二:

redis-server conf/redis-6380.conf --slaveof 127.0.0.1 6379

方式三:

在配置文件redis.conf  slaveof 127.0.0.1 6379

 

 

哨兵模式
哨兵(sentinel)是一个分布式系统, 用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的
master并将所有slave连接到新的master。

哨兵的作用
●监控
不断的检查master和slave是否正常运行。
master存活检测、master 与slave运行情况检测
0通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
0自动故障转移
断开master与slave连接,选取-个slave作为master, 将其他slave连接到新的master,并告知客户端新的服
务器地址
注意:
哨兵也是一台redis服务器, 只是不提供数据服务
通常哨兵配置数量为单数

企业级解决方案

◆缓存预热

缓存预热:就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓

存的问题!用户直接查询事先被预热的缓存数据!

◆缓存雪崩

1.更多的页面静态化处理
2.构建多级缓存架构
Nginx缓存+redis缓存+ ehcache缓存
3.检测Mysq|严重耗时业务进行优化
对数据库的瓶颈排查:例如超时查询、耗时较高事務等
4.灾难预警机制
监控redis服务器性能指标
●CPU占用、CPU使用率
●内存容量
●查询平均响应时间
●线程数
5.限流、降级
短时间范围内牺牲一些客户体验, 限制一部分请求访问, 降低应用服务器压力,待业务低速运转后再逐步放开访问

  1. LRU与LFU切换
    2.数据有效期策略调整
    ●根据业务数据有效期进行分类错峰, A类90分钟,B类80分钟, C类70分钟
    ●过期时间使用固定时间+ 随机值的形式,稀释集中到期的key的数量
    3.超热数据使用永久key
    4.定期维护(自动+人工)
    对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时
    5.加锁
    慎用!

总结
缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如能够有效避免过期时间集中,可以有效解决雪崩现象的出现
(约40%),配合其他策略一起使用, 并监控服务器的运行数据,根据运行记录做快速调整。

◆缓存击穿

原因:

  1. Redis中某个key过期, 该key访问量巨大

  2. 多个数据请求从服务器直接压到Redis后,均未命中

  3. Redis在短时间内发起了大量对数据库中同- 数据的访问

解决方案(术)
1.预先设定
以电商为例,每个商家根据店铺等级,指定若干款主打商品,在购物节期间,加大此类信息key的过期时长
注意:购物节不仅仅指当天,以及后续若千天,访问峰值呈现逐渐降低的趋势
2.现场调整
监控访问量,对自然流量激增的数据延长过期时间或设置为永久性key
3.后台刷新数据
启动定时任务,高峰期来临之前,刷新数据有效期,确保不秩
4.二级缓存
设置不同的失效时间,保障不会被同时淘汰就行
5.加锁
分布式锁,防止被击穿,但是要注意也是性能瓶颈,慎重!

 

总结
缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis后,发起了大量对同一数据的数据库访问,导致对数据库服
务器造成压力。应对策略应该在业务数据分析与预防方面进行,配合运行监控测试与即时调整策略,毕竟单个key的过期监控难度
较高,配合雪崩处理策略即可。

◆缓存穿透

原因:

   问题排查

  1. Redis中大面积出现未命中

  2. 出现非正常URL访问

问题分析
●获取的数据在数据库中也不存在,数据库查询未得到对应数据
●Redis获取到null数据未进行持久化, 直接返回
●下次此类数据到达重复 上述过程
●出现黑客攻击服务器

解决方案(术)
1.缓存null
对查询结果为null的数据进行缓存(长期使用,定期清理) , 设定短时限,例如30-60秒,最高5分钟
2.白名单策略
●提前预热各种分类数据id对应的bitmaps, id作为bitmaps的offset, 相当于设置了数据白名单。当加载正常数据时,放
行,加载异常数据时直接拦截(效率偏低)
●使用布隆过滤器(有关布隆过滤器的命中问题对当前状况可以忽略)
3.实施监控
实时监控redis命中率(业务正常范围时,通常会有一个波动值) 与nulI数据的占比
●非活动时段波动: 通常检测3- 5倍,超过5倍纳入重点排查对象
●活动时段波动:通常检测10-50倍,超过50倍纳入重点排查对象
根据倍数不同,启动不同的排查流程。然后使用名单进行防控(运营)

  1. key加密
    问题出现后,临时启动防灾业务key,对key进行业务层传输加密服务,设定校验程序,过来的key校验
    例如每天随机分配60个加密串,挑选2到3个, 混淆到页面数据id中,发现访问key不满足规则,驳回数据访问

总结
缓存击穿访问了不存在的数据,跳过了合法数据的redis数据缓存阶段,每次访问数据库,导致对数据库服务器造成压力。通常此类
数据的出现量是一个较低的值, 当出现此类情况以毒攻毒,并及时报警。应对策略应该在临时预案防范方面多做文章。
无论是黑名单还是白名单,都是对整体系统的压力,警报解除后尽快移除。

◆性能指标监控

posted @ 2020-04-22 10:03  眯眯  阅读(102)  评论(0)    收藏  举报