redis简单教程
redis的安装和配置
下载地址http://redis.io/download
安装步骤:
1 首先需要安装gcc,把下载好的redis-3.0.0-rc2.tar.gz 放到linux /usr/local文件夹下
2 进行解压 tar -zxvf redis-3.0.0-rc2.tar.gz
3 进入到redis-3.0.0目录下,进行编译 make
4 进入到src下进行安装 make install 验证(ll查看src下的目录,有redis-server 、redis-cil即可)
5 建立俩个文件夹存放redis命令和配置文件
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin
6 把redis-3.0.0下的redis.conf 移动到/usr/local/redis/etc下,
cp redis.conf /usr/local/redis/etc/
7 把redis-3.0.0/src里的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server
文件移动到bin下,命令:
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
8 启动时并指定配置文件:./redis-server /usr/local/redis/etc/redis.conf(注意要使用后台启动,所以修改redis.conf里的 daemonize 改为yes)
9 验证启动是否成功:
ps -ef | grep redis 查看是否有redis服务 或者 查看端口:netstat -tunpl | grep 6379
进入redis客户端 ./redis-cli 退出客户端quit
退出redis服务:
(1)pkill redis-server 、
(2)kill 进程号、
(3)/usr/local/redis/bin/redis-cli shutdown
redis有五种基本数据类型
string 字符串
hash 对象
list 列表
set 集合
zset 有序集合
字符串的命令:
1.set key value # 保存一个键值对
image.png
2.get key # 通过key来去对应的值
image.png
3.mset key1 v1 k2 v2... # 一次保存多个键值对
image.png
4.mget k1 k2 k3 # 通过key来去对应的值
image.png
5.setex key second value # 保存一个键值对,同时规定它的失效时间(second)
image.png6.incr key # 对key对应值 加一,注意,只对数据字符串有效
7.incrby key value # 对key对应值 加value
image.png
8.decr key # 对key对应值 减一,注意,只对数据字符串有效
参考字符串的命令6
9.decrby key value # 对key对应值 减value
参考字符串的命令7
10.strlen key # 求key对应值的长度
image.png
11.append key value # 对key对应的值末尾进行新的拼接
image.png12.setnx key vaule # 如果存在key,则无效,如果不存在,则保存该键值对
image.png
- getrange key start end # 获取start和end之间的值
hash命令:主要用来存储对象的
u1 = User(1, "liding", 16, "zhengzhou")
u2 = User(2, "huiyi", 26, "xinyang")
1.hset key field value # 存储key对应属性field的值
image.png(相当于 u1.name == liding)
2.hget key field # 获取key对应属性field的值
image.png
3.hmset key f1 v1 f2 v2...# 存储key对应多个属性field的值
image.png4.hmget key f1 f2... # 获取key对应多个属性field的值
image.png
5.hgetall key # 获取key对象所有属性和对应的值
image.png6.hkeys key # 获取key对象的所有属性的名称
7.hvals key # 获取key对象的所有属性的值
参考hash命令6
8.hlen key # 获取key的所有属性个数
image.png
9.hstrlen key field # 获取key对应的属性的值的长度
image.png
10.hexists key field # 判断某个对象是否存在该属性
image.png
11.hsetnx key field value # 判断对象的属性是否存在,存在则不操作,不存在,则保存
参考字符串的命令10
12.hincrby key field value # 对对象的属性(必须是数字字符串)进行加法运算
image.pngkey操作
1.keys * # 查询当前数据库中所有key的个数
image.png2.exists key # 判断某个key是否存在在当前数据库
image.png
3.del key # 删除对应的key
image.png
4.type key # 判断key的类型
image.png
5.expire key second value # 为一个存在的key设置一个失效时间 image.png
6.ttl key # 查看key的失效时间 -2表示不存在 -1 永久存在 正数表示存活的秒数
image.png
7.move key db # 移动key到db数据库中
image.png
8.select index # 切换数据库
image.png
9.info [xxxx] # 查看当前数据库的状态
image.png
image.png
10.dbsize # 返回当前数据库的key的个数
image.png11.flushdb # 删除当前数据库的所有数据
image.png
12.flushall # 删除所有数据库的所有数据
自行处理(慎用)
13.persist key # 让key永久保存
image.pnglist命令
1.lpush key v1 v2... # 从左侧将值放入list中
image.png
2.rpush key v1 v2... # 从右侧将值放入list中
参考list命令1
3.lrange key start end # 循环显示list
image.png4.linsert key b|a piovt v # 将值插入到对应的位置
image.png
5.lpop key # 从左侧删除第一个元素
image.png
6.rpop key # 从右侧删除最后一个元素
参考list命令5
7.llen key # 获取list的长度
image.png
8.ltrim key start stop # 切割列表
image.png
9.lindex key index # 获取索引位对应的元素
image.png
set集合
1.sadd key v1 [v2 v3] # 添加值到set集合中
image.png
2.smembers key # 迭代遍历set集合
image.png3.sismember key value # 判断是否存在一个元素在set集合中
image.png
4.scard key # 得到set的元素个数
image.png
5.sinter s1 s2 # 求两个集合之间的交集
image.png
6.sdiff s1 s2 # 求两个集合之间的差集
image.png
7.sunion s1 s2 # 求两个集合之间的并集
image.pngsorted set 有序集合
1.zadd key s1 v1 s2 v2... # 为有序集合增加元素,该元素存在一个权重,用于判断位置
image.png2.zcard key # 求有序集合的元素个数
image.png
3.zrange key start stop # 遍历整个集合
image.png4.zcount key min max # 统计两个权重的元素个数
image.png5.zscore key 元素 # 返回该元素在集合中的权重
image.png
redis密码设置
1.sudo vim redis.conf
2.找到 #requirepass root
3.将root改为自己想设置的密码保存退出,重启redis
5.重启后auth 密码
就可以正常使用了
缓存穿透
什么是缓存穿透?
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
如何避免?
1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存击穿
什么是缓存击穿?
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
如何避免?
1.使用互斥锁(mutex key)
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
- "提前"使用互斥锁(mutex key):
在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中
3.. "永远不过期":
这里的“永远不过期”包含两层意思:
(1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。
- 资源保护:
采用netflix的hystrix,可以做资源的隔离保护主线程池,如果把这个应用到缓存的构建也未尝不可。
缓存雪崩
什么是缓存雪崩?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)