Redis基础篇(一)

Redis 是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的 Web 应用程序。Redis 也被作者戏称为数据结构服务器 ,这意味着使用者可以通过一些命令,基于带有 TCP 套接字的简单服务器-客户端协议来访问一组可变数据结构 。

Redis是什么?

  • Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

    ​ 1、Redis安装在磁盘

    ​ 2、Redis数据存储在内存

  • Redis解决什么问题

    image-20191217201429438

    ​ 先从Redis缓存查询数据,如果没有则到MySQL中查

  • Redis特性

    • 速度快

    • 键值对数据结构服务器

    • 丰富的功能

    • 简单稳定 --- 单线程

    • 持久化

    • 高可用、分布式转移

    • 客户端语言多

  • Redis使用场景

    1. 缓存数据库

    2. 排行榜

    3. 计数器应用

    4. 社交网络

    5. 消息队列

    6. 其他场景

Redis数据类型?

String

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

    set age 18	(18)
    incr age		(19)
    decr age		(18)
    incrby age 2	(20)
    decrby age 2	(18)
    
  • 批量设值 mset

    mset name Rick age 20
    

​ 批量设置,可减少IO进而提高效率

  • 设置过期时间

    set age 23 ex 10	// 10s后过期 px 10000ms过期
    
  • 常用用法

    set name Rick
    append name Kay
    get name			(RickKay)
    
  • String应用场景

    • 计数器

      INCR article:readcount:{文章id}		// 统计某文章的阅读量,用户进来点一次进行加1
      GET article:readcount:{文章id}		// 获得某文章的阅读量
      
      INCR article:readcount:1001
      INCR article:readcount:1001
      INCR article:readcount:1001
      INCR article:readcount:1001
      GET article:readcount:1001		(4)
      
    • Web集群session共享

      Spring session + redis实现session共享

    • 分布式系统全局序列号

Hash

  • Hash 哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象

    存储一个用户(user)信息:1主键

    hset

    hset user:1 name Rick age 20
    hgetall user:1		("name" "Rick" "age" "20")
    hget user:1 age					("20")
    

    hmset

    hmset user:2 name Kay age 20 sex male
    hmget user:2 name age sex			("Kay" "20" "male")
    hgetall user:2	 ("name" "Kay" "age" "18" "sex" "male")
    hvals user:2				("Kay" "18" "male")
    
  • 三种方式存储用户信息的优缺点

    • 原生:set user:1:name james

      set user:1:age 23

      set user:1:sex boy

      ​ 优点:简单直观,每个键对应一个值

      ​ 缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

    • 将对象序列化存入Redis set user:1 serialize(userInfo)

      ​ 优点: 编程简单

      ​ 缺点:序列化和反序列化有开销

    • 使用Hash类型

      ​ 优点:简单直观,使用合理可减少内存空间消耗

      ​ 缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize

  • 应用场景

    • 电商购物车

      image-20200304210814747

      以用户id为key;商品id为filed;商品数量为value

      例如用户1001的购物车的相关操作:

      添加商品 ---> hset cart:1001 10088 1

      增加数量 ---> hincrby cart:1001 10088 1

      商品总数 ---> hlen cart:1001

      删除商品 ---> hdel cart:1001 10088

      获取购物车所有商品 ---> hgetall cart:1001

List

  • rpushlpush

    image-20191218172422826

    rpush:在list的尾部追加元素

    lpush:在list的头部追加元素

    lrange key start stop :返回列表key中指定区间内的元素,区间以偏移量startstop指定

    rpush str a b c
    lrange str 0 -1					("a" "b" "c")
    lpush str1 a b c
    lrange str1 0 -1					("c" "b" "a")
    
  • 因为有序,可以通过索引下标获取元素或某个范围内元素列表

    llen 获取当前列表长度

    lpop 把左边第一个元素删掉

    rpop 把右边第一个元素删掉

    llen str			(3)
    lpop str			(a)
    rpop str			(c)
    
  • 应用场景

    • Stack : LPUSH + LPOP ==> FILO

    • Queue:LPUSH+ RPOP

    • Blocking MQ : LPUSH + BRPOP

    • 微博和微信公众号消息流

      公众号A发微博,消息id为10018

      LPUSH msg:1001 10018

      公众号B发微博,消息id为10086

      LPUSH msg:1001 10086

      查看最新微博消息

      LRANGE msg:rick 0 5

Set

  • sadd sinter(求交集)

保存多元素,与列表不一样的是不允许有重复元素,且集合是无序

image-20191218173253651
sadd user a b c					(3)
sadd user a						(0)
  • 集合使用场景:

    • 微博微信点赞

      sadd like:{消息id} {用户id} ==> 点赞

      srem like:{消息id} {用户id} ==> 取消点赞

      sismember like:{消息id} {用户id} ==> 检查用户是否点赞

      smembers like:{消息id} ==> 获取点赞的用户列表

      scard like:{消息id} ==> 获取点赞用户数

    • 微信小程序抽奖

      sadd key {userID} ==> 点击参与抽奖

      smembers key ==> 查看参与抽奖所有用户

      srandmember key[count](抽完后不剔除) / SPOP key [count](抽完后剔除) ==> 抽取count名中奖者

    • 集合操作实现微博微信关注模型

      A关注的人:ASet: {B,C,D}

      B关注的人:BSet: {A,C,D,E}

      C关注的人:CSet: {A,B,E,F}

      A和B的共同关注(求交集): SINTER ASet BSet ==> {C,D}

      A关注的人也关注B(列举出A关注的人是否关注B): sismember CSet B sismember DSet B

      A可能认识的人(差集):sidff ASet BSet

Zset

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

zadd zan 100 Rick
zadd zan 200 kay
zadd zan 150 Lee
zrange zan 0 -1 withscores			("Rick" "100" "Lee" "150" "kay" "200")
赞赏