redis简单教程

2019-07-19  本文已影响0人  一只酸柠檬精

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.png

6.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.png

12.setnx key vaule # 如果存在key,则无效,如果不存在,则保存该键值对


image.png
  1. 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.png

4.hmget key f1 f2... # 获取key对应多个属性field的值


image.png

5.hgetall key # 获取key对象所有属性和对应的值

image.png

6.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.png

key操作

1.keys * # 查询当前数据库中所有key的个数

image.png

2.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.png

11.flushdb # 删除当前数据库的所有数据


image.png

12.flushall # 删除所有数据库的所有数据

自行处理(慎用)

13.persist key # 让key永久保存

image.png

list命令

1.lpush key v1 v2... # 从左侧将值放入list中


image.png

2.rpush key v1 v2... # 从右侧将值放入list中

参考list命令1

3.lrange key start end # 循环显示list

image.png

4.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.png

3.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.png

sorted set 有序集合

1.zadd key s1 v1 s2 v2... # 为有序集合增加元素,该元素存在一个权重,用于判断位置

image.png

2.zcard key # 求有序集合的元素个数


image.png

3.zrange key start stop # 遍历整个集合

image.png

4.zcount key min max # 统计两个权重的元素个数

image.png

5.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缓存的方法。

  1. "提前"使用互斥锁(mutex key):

在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中

3.. "永远不过期":

这里的“永远不过期”包含两层意思:

(1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期

    从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。
  1. 资源保护:

采用netflix的hystrix,可以做资源的隔离保护主线程池,如果把这个应用到缓存的构建也未尝不可。

缓存雪崩

什么是缓存雪崩?

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

如何避免?

1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)

上一篇下一篇

猜你喜欢

热点阅读