学习笔记-Redis基础常识

一:redis的安装。

  可以参考:https://www.it610.com/article/3710373.htm ,这个真的是图文并茂的。每一步都很清楚。

二:Redis特性

  1)速度快,内存、单线程、多路复用协议。

  2)键值对的数据结构服务器,5种常用数据结构: String hash list set zSet。

  3)丰富的功能。

  4)简单稳定,单线程,协议简单。

  5)持久化,将内存数据写入磁盘。

  6)主从复制,实现多个相同数据的redis副本。

  7)高可用和分布式集群,哨兵机制实现高可用,保证redis节点故障发现和自动转移。

三:应用场景

  1、缓存数据库:合理使用缓存加快数据访问速度,降低关系型数据库压力

  2、排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合

  3、计数器应用:视频网站播放数,网站浏览数

  4、社交网络:赞、踩、粉丝、下拉刷新

  5、消息队列:发布和订阅

四:数据结构

  1. String:字符串类型:实际上可以是字符串(包括 XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过 512MB 。设值指令,

  设值指令:set age 22 ex 10 // 10秒后过期, ttl age 查询剩余时间

        setnx name test // 不存在键name时,返回1设置为成功,返回0失败

  获取指令:get age // 存在返回age的值

  删除指令:del age // 删除age,返回1

  批量操作:mset name wanglei age 22 // 批量set

        mget name age // 批量get

  计数:incr age // 必须为证书自加1,非整数返回错误,无age键从0开始自增返回1

     decr age // 整数age减1

        incrby age 2 // 整数age + 2

     decrby age 2 // 整数age - 2

     incrbyfloat score 1.1 // 浮点型 score + 1.1

  追加、长度、截取字符串:set name hello;

              append name zhangsan; // 追加字符串,变成 hellozhangsan

              set zhangsan "张三";

              strlen zhangsan // 字符串长度,结果为6,每个中文占3个字节

              set name helloworld;

              getrange name 0 2 // 截取字符串,返回hel

  注意:EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。

    PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。

    NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。

    XX : 只在键已经存在时, 才对键进行设置操作。

  2. Hash:最大存储512M

  设置指令:hset user:1 name wanglei// 成功返回1,失败返回0

  读取指令hget user:1 name // 返回wanglei

  计算field个数:hlen user:1 // 返回2

  删除field:hdel user:1 name // 返回删除个数

  批量:hmset user:2 name wanglei age 23 sex boy //返回OK

  hmget user:2 name age sex    //返回三行:wanglei 23 boy

  3. List:用来存储多个有序的字符串,一个列表可以存的最大元素:2的23次方减1 。因为有序,可以通过索引下标获取元素或某个范围内的元素列表,列表元素可以重复。

  指令:rpush testlist c b a // 从右向左插入c b a, 返回3

    lrange testlist 0 -1 // 从左往右获取列表元素,返回c b a,0 -1为索引下标

    lpush testlist 1 2 3 // 从左向右插入1 2 3, 返回6

    linsert testlist before 1 0 // 在1之前插入0,返回7,after为之后,使用lrange testlist 0 -1 查看,返回结果为3 2 0 1 c b a

    lindex testlist -1 // 返回最右末尾a,-2返回b

    llen testlist // 当前列表长度,返回7

    lpop testlist // 把最左边的第一个元素删除,返回3

    rpop testlist // 把最右边的第一个元素删除,返回a

  4. Set:用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集。

  指令:exists user // 检查user键值是否存在,存在返回1,不存在返回0

     sadd user a b c // 向user插入3个元素,返回3

     sadd user a b // 若再加入相同的元素,则重复无效,返回0

     smembers user // 获取user的所有元素,返回结果无序

     srem user a // 返回1,删除a元素

     scard user // 返回2,计算元素个数场景,求共同爱好语言使用方式,给用户添加标签,或者给标签添加用户。

     给用户添加标签:sadd user:1:fav java js vue python

             sadd user:2:fav vue python node.js

             sadd user:3:fav c c++ c#

     求共同爱好,即求交集:sinter user:1:fav user:2:fav // 返回vue、python

                sinter user:1:fav user:2:fav user:3:fav // 返回(empty list or set)

  5. zSet:常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员。

  指令:zadd user:zan 200 wanglei 120 zhangsan 140 lisi // 增加元素,返回3

     zrange user:zan 0 -1 withscores // 查询元素,返回点赞数和成员名称,返回张三 120 lisi 140 wanglei 200

     zrank user:zan lisi // 返回名次,返回1,排名为0,1,2

     zrevrank user:zan wanglei // 反向排名,点赞越多排名越前,返回0

     zadd test:1 nx 100 wanglei // 键test:1必须不存在,主要用于添加

     zadd test:1 xx incr 200 wanglei // 键test:1必须存在,主要用于修改,此时300

     zadd test:1 xx ch incr -299 wanglei // 返回操作结果1,300-29=1

     zcard test:1 // 计算成员个数,返回1

五:缓存雪崩

  为了节约内存,Redis 一般会做定期清理数据,但是因为数据清理之后,如果同一时间并发请求被清理的数据,这时候就会去查询MySQL,但是因为MySQL性能问题,大量的并发请求会导致MySQL崩溃。解决思路:比如5000个并发请求,上锁,只允许一个线程进入Java代码,然后查询MySQL数据库,将缓存放入redis。解锁,然后剩下的4999个查询redis就不会导致MySQL崩溃了。

六:缓存穿透

  比如模拟一个不存在的订单号xxx,Redis中没有这个订单号。MySQL中也没有这个值,但是一直被查询。解决思路:对订单表所有数据查询出来放到布隆过滤器, 经过布隆过滤器处理的数据很小(只存0或1)。查订单表前,先到过滤器里查询当前订单号状态是0还是1, 0的话代表数据库没有数据。另外也可以缓存一个空值。

 

posted @ 2016-07-12 22:15  小杨ABC  阅读(3027)  评论(6编辑  收藏  举报