redis知识点梳理

1. 核心数据结构

  • string : 主要用于单值缓存,对象缓存,分布式锁,计数器, 集群session共享, 全局id
  • hash: 对象缓存,电商购物车。优点是归类存储,方便数据管理,相比string消耗内存更小,cpu更少,更节省空间。
    缺点是集群架构下不适合大规模使用,过期功能不能使用在field上。
  • list: 微博微信消息流。
  • set:
    • 微信抽奖小程序
      • sadd act:1000 1 2 3 :添加抽奖人数
      • smembers act:1000 : 查看全部抽奖人
      • srandmember act:1000 1 : 开奖
    • 微博点赞,收藏,标签
      • 点赞 sadd like:消息id {用户id}
      • 取消点赞: srem like:消息id {用户id}
      • 检查用户是否点赞: sismember like:消息id {用户id}
      • 获取点赞的用户列表: smembers like:消息id
      • 获取点赞用户数: scard like:消息id
    • 关注模型:
      • 我关注的 : meset {A,B,C}
      • 他关注的 : heset {B,C,D}
      • 你关注的 : yuset {D,E,F}
      • 共同关注 : sinter meset heset
      • 我关注的也关注他: sismember meset B,sismember heset B
      • 我可能认识的人: sdiff yuset heset
  • zset:
    • 微博热搜:
      • 点击新闻 zincyby hotnews:20180919 1 守护香港
      • 排行前十 zrevrange hotnews:20180919 0 9 withscores
      • 七日搜索榜单: zunionstore hotnews:20180919-20180925 7 hotnews:20180919 … hotnews:20180925
      • 七日排行前十: zrevrange hotnews:20180919-20180925 0 9 withscores

2. redis线程模型

  • 纯内存操作
  • 核心是基于非阻塞的IO多路复用机制
  • 单线程反而避免了多线程频繁切换上下文的问题

3. redis性能调优

  • 数据分组(1组1000个左右)
  • 只存储热点数据

4. 电商购物车的实现

  • 用户id为key,商品id为field,商品数量为value。
  • 添加商品: hset cart:10001 10000 1
  • 增加数量: hincrby cart:1001 10000 1
  • 商品总数: hlen cart:1001
  • 删除商品: hdel cart:1001
  • 获取购物车所有商品: hgetall cart:1001

5. list常用操作

  • lpush
  • rpush
  • lpop
  • rpop
  • lrange
  • blpop key timeout
  • brpop key timeout: 从key列表表尾弹出一个元素,若列表中没有元素,则阻塞等待 timeout 秒,若
    timeout = 0,则一直阻塞等待。

6. set常用操作

  • set基本操作
    • sadd key member [member…]: 往集合key中存入元素,元素存在则忽略,key不存在则新建。
    • srem key member [member…]: 从集合key中删除元素
    • smembers key : 获取集合key中所有元素
    • scard key: 获取集合key的元素个数
    • sismember key member: 判断member是否存在集合key中。
    • srandmember key [count] : 从集合key中选出count个元素,元素不从key中删除
    • spop key [count] : 从集合key中选出count个元素,元素从key中删除
  • set集合运算
    • sinter set1 set2 set3 : 交集运算
    • sunion set1 set2 set3 : 并集运算
    • sdiff set1 set2 set3 : 差集运算(以第一个集合为基准,减去后面所有集合的并集)

7. zset常用操作

  • 常用操作
    • zadd key score member [score member…] : 往有序集合key中插入带分值元素
    • zrem key member : 从有序集合key中删除元素
    • zscore key member: 返回有序集合key中member元素的分值
    • zincyby key increment member: 为有序集合key中元素member的分值加上increment
    • zcard key : 返回有序集合key中元素个数
    • zrange key start stop : 正序获取下标从start到stop的元素
    • zrevrange key start stop: 倒序获取
  • zset集合运算
    • zunionstore deskkey numkeys key 并集计算
    • zinterstore deskkey numkeys key 交集计算

8. 分布式锁

  • synchronized(this){}只适用于单机环境。
  • setnx key value
    • 将key的值设为value,如果key的值已经存在,则不做任何改变。用于加锁。
  • 在jedis中分布式锁实现(依然无法解决机率锁失效的问题):
  public String lock(){
      String lockKey = "product_001";
      String clientId = UUID.randomUUID().toString();
      try{
          Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, 
                                                                         clientId, //线程id
                                                                         10, //超时时间
                                                                         TimeUnit.SECONDS
                                                                         );
          if(!result){
              return "error_code";
          }
          int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
          if(scock > 0){
              int realStock = stock - 1;
              stringRedisTemplate.opsForValue().set("stock",realStock+"");
              System.out.println("秒杀成功,剩余库存"+realStock);
          }else{
              System.out.println("秒杀已结束");
          }
      }finally{
          if(clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){
              stringRedisTemplate.delete(lockKey);
          }
      }
  }
  • 使用redisson框架实现
  public String lock(){
      String lockKey = "product_001";
      Rlock redissonLock = redisson.getLock(lockKey);
      try{
          redissonLock.lock();
          int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
          if(scock > 0){
              int realStock = stock - 1;
              stringRedisTemplate.opsForValue().set("stock",realStock+"");
              System.out.println("秒杀成功,剩余库存"+realStock);
          }else{
              System.out.println("秒杀已结束");
          }
      }finally{
          redissonLock.unlock();
      }
  }

9. zookeeper架构定义

  • CAP架构:
    • C: 绝对的一致性
    • A: 可用性
    • P: 分区容错性
  • redis是AP架构, zookeeper是CP架构
  • zookeeper的zab选举机制

10. 高并发式分布锁的实现

  • 分段锁

11. 一线大厂技术栈

  • 分布式架构
  • 微服务架构
  • 源码分析
  • 性能优化
  • 数据结构与算法
  • 高并发项目实战
  • 工程化协作
  • 并发编程

12. 微服务与分布式的区别

  • 微服务算是分布式的一环。
  • 微服务强调的是个体,分布式强调的是整体。

13. dubbo与spring cloud的区别

  • dubbo相当于spring cloud下的一个子集
  • spring cloud是微服务架构一个完整的解决方案

14. redis特性

  • 非关系型的键值对数据库,可以以O(1)的时间复杂度快速插入或取出值。
  • 数据是存在内存中的
  • 键的类型可以是字符串,整型,浮点型,键是唯一的。
  • 内置了复制,lua脚本,磁盘持久化,事务,ssl,客户端代理等功能
  • 通过redis哨兵和自动分区提供高可用性。
  • 存储海量数据与高性能存取
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值