zoukankan      html  css  js  c++  java
  • 学习笔记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的话代表数据库没有数据。另外也可以缓存一个空值。

  • 相关阅读:
    Freckles (最小生成树)
    素数筛法 模板
    Least Common Multiple (最小公倍数,先除再乘)
    Watering Grass (贪心,最小覆盖)
    Minimal coverage (贪心,最小覆盖)
    今年暑假不AC (贪心)
    Bzoj1072 [SCOI2007]排列perm
    Bzoj1087 [SCOI2005]互不侵犯King
    POJ1185 炮兵阵地
    POJ3254 Corn Fields
  • 原文地址:https://www.cnblogs.com/yangkangIT/p/5665102.html
Copyright © 2011-2022 走看看