redis

作者: LoseDemon | 来源:发表于2018-07-02 20:03 被阅读0次

安装:
linux:
redis-stable.tar.gz(源代码包):
tar -zxvf
make
cd src
make install
sudo apt-get/apt install redis-server(不推荐)
windows:
exe:
下一步
zip:
1、解压zip包
2、将主目录配置到path
3、cmd redis-server
4、cmd redis-cli
将redis-server注册为windows的服务或者linux的守护进程
widows:
redis-server 配置文件的绝对路径 --service-install
net start redis #启动redis服务
redis-cli
linux:
修改配置文件:137行 daemonize yes表示以守护进程运行redis
redis-service 配置文件的绝对路径
redis-cli

redis的五种数据类型:
String:
hash:
list:
set:
sorted set zset:

set key value #表示将key对应的字符串存储起来
get key #获取key对应的值
mset key1 v1 key2 v2 key3 v3 #多个键值对保存
mget key1 key2 key3 #获取多个key对应的值
setex key seconds value #设置一个key,seconds秒后失效 (ex:expire失效)
incr key #将key对应的值加一,注意:只能是数字字符串
incrby key number #将key对应的值加number
decr key #将key对应的值减一
decrby key number #将key对应的值减number
strlen key #求key对应的长度
append key value #对key的值末尾进行追加
setrange key offset value #将key对应的值的offset位置开始替换为value
getrange key start end #获取key对应的值的区间值
setnx key value #判断是否存在key,如果不存在,则增加

对key的操作
keys * #查询当前数据库下的所有key
exists key #判断key是否存在
type key #判断key对用的值的类型
del key #删除key
expire key seconds #为一个存在的key设置失效时间
ttl key #查看某个key的失效时间 -1永久有效 -2 失效 正数则表示正在失效
persist key #取消key的失效,让它永久有效
select key #切换数据库
move key index #将当前数据库的key移动到对应的数据库下
dbsize #返回当前数据库下的key的键
info #查询当前数据库的信息
flushdb #清空当前数据库 (慎用)
flushall #清空所有数据库 (慎用)

hash的操作:
hset key field value #保存一个对象的属性
hget key field #通过对象的属性获取值
hmset key f1 v1 f2 v2... #保存一个对象的多个属性和值
hmget key f1 f2......... #通过对象的多个属性获取值
hgetall key #获取对象的所有属性和值
hkeys key #获取对象的所有属性名称
hvals key #获取对象的所有属性值
hlen key #获取对象的属性个数
hexists key field #查询对象是否存在某个属性
hdel key field #删除对象的某个属性
hstrlen key field #查询对象的属性的值的长度
hstnx key value #
hincrby key field value #

list列表:
redis的list是一个队列和栈 字符串的实现
lpush key value1 value2...... #从左侧压入数据到list中
rpush key value1 value2..... #从右侧压入数据到list中
lrange key start end #从左侧start位置开始循环展示数据,到end结束
linsert key before | after pivot value #在指定位置插入数据
lpop key #移除第一个元素
rpop key #移除最后一个元素
lindex key index #获取索引对应的值
ltrim key start end #截取list,从start位置开始,到end结束
lrem key count value #删除value元素,count个

set集合:
sadd key value1 value 2 #将v1,v2添加到set中
smembers key #展示set中所有元素
sismember key value #判断value在不在key中
scard key #返回set的元素个数
sinter key [key] #获取多个集合 交集
sdiff key [key] #获取多个集合的差集
sunion key [key] #获取多个集合的并集
srem key member #移除元素
spop key [count] #随机移除元素
sdiffstore newkey key1 key2 #将差集保存成一个新的set
srandmember key #随机获取一个元素

zset集合:
zadd key score value [score value] #将值添加到zset中
zrange key start stop #遍历展示数据
zacard key #返回set的元素个数
zcount key min max #用来统计区间范围内

缓存:
面试题:什么是缓存击穿、什么是缓存穿透?
缓存击穿:对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。

缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方案: 1.使用互斥锁(mutex key)
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
代码如下:

缓存击穿解决方案1-1.png
最新版本代码:
缓存击穿解决方案1-2.png
缓存击穿解决方案1-3.png
2. "提前"使用互斥锁(mutex key):
在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。
代码如下: 缓存击穿解决方案2.png
3. "永远不过期": 这里的“永远不过期”包含两层意思:
(1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。
代码如下: 缓存击穿解决方案3.png
4. 资源保护:
采用netflix的hystrix,可以做资源的隔离保护主线程池,如果把这个应用到缓存的构建也未尝不可。
缓存穿透:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞
解决方案:有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存击穿解决方案4.png 8519819545201563621.jpg

相关文章

网友评论

      本文标题:redis

      本文链接:https://www.haomeiwen.com/subject/hmykuftx.html