美文网首页
redis简单教程

redis简单教程

作者: 一只酸柠檬精 | 来源:发表于2019-07-19 18:35 被阅读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设置为长期(此点为补充)

    相关文章

      网友评论

          本文标题:redis简单教程

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