精通Redis 1 - Redis概览 和基础数据结构

一、Redis 概览

1.1 Redis 全称是Remote Dictionary Service

远程字典服务,从名称看,redis 最开始的设计思想,是一个远程的key-value 的存储服务,主要用来解决系统缓存,分布式的数据共享问题。程序员在学生阶段的课程设计往往是单实例(单体的应用),中小型公司起步的时候,往往也是从一个war 包开始,随着业务的发展慢慢的进化成分布式系统。

1.2Redis定位于一个内存数据库

内存保存数据,可以省去读取磁盘的时间,明显提高数据读取速度,redis之前,如果需要把数据放入内存,解决方法往往需要依赖 J2EE 平台,或者Mysql 的内部缓存。

使用J2EE 把常用数据载入到一个数据结构如 List、Map中,长驻JVM ,单这样做的缺点是 受制于JVM垃圾回收机制,长时间未使用的对象会被清除,也不利于架构扩展,对于分布式系统,你必须自己实现一个内存服务,否则各个示例不会共享缓存,这点和session 共享类似

redis的出现很好的解决这个问题。

后边随着redis的发展壮大,依托自己多样的数据结构,发展更多的应用场景,个人认为,其最核心的使用场景,远程内存存储服务。
其他的如分布式锁、队列、订阅发布等功能,都有其他产品的成熟方案,对于中小公司,在资源紧张或者系统简单的情况下,可以利用redis 实现多种场景,但业务复杂,或者

1.3 Redis 常用场景

缓存

使用 String 结构 缓存 常用信息,注意保持缓存和数据库的数据一致性,一般使用双删策略,可以对比 mysql binlog 和redo log

理解使用 。

分布式锁

Redis 的分布式锁,使用 setnx 命令实现,建议加上过期时间,锁被意外情况长期占用,redis 分布式锁的实现原理简单,也足够高效,适用一般场景,如果涉及特殊场景,例如 付款,账单 谨慎使用。

Redis 官方提供的RedLock 使用集群提高了可用性,但仍未解决网络分区导致的锁异常。

计数器

这个比较容易理解

共享Session

共享session的其中一种解决方案。

限流

使用Zset 维护一个时间窗口,理论是滑动窗口限流,如果应用单实例,Java可以使用Dqueue

实现,redis 可以实现分布式限流,这种限流仍旧是局限访问次数不能过大,如果是每分钟一百万次限流则不适用。

二、Redis 基本数据结构

2.1 String

redis 最简单的数据结构,内部用一个字符数组表示

常见存储用户信息,用户json 信息保存在redis 字符串中,redis 字符串是动态可以修改,预先分配冗余的内存空间减少内存的频繁分配。

当capacity<len 时 扩容,当len <1MB 时 每次翻倍,当len >1MB 时,每次增加1MB
那么 1MB 可以存储多少个字符。

字符串最大的长度512MB

因为一个汉字是2个字节,而1Kb=1024个字节,1M=1024Kb
那么计算公式应该是:1M=1024 × 1024/2=524288(个汉字)

命令:

GET name
SET name  andy
DEL name
EXISTS name
redis-cluster-12(192.168.5.13:6380)>del user:1:2
"0"

删除成功返回1:key 不存在,删除失败返回 0

设置过期:

redis-cluster-12(192.168.5.11:6379)>expire user:{4}:3 6537
已连接到集群。
redis-cluster-12(192.168.5.11:6379)>
redis-cluster-12(192.168.5.13:6380)>
"1"

计数功能,准确的计数,redis hyperloglog 统计访问数量,比较准确的计数

set num 30
incr num 
31
incrby num 5
36
incrby num -5
31

计数的范围在signed long的最大值和最小值

2.2 Hash

hash 相当于 Java中的hashMap

无序字典

底层组成和Java一样,数组和链表

jdk1,8 中 链表和在长度变大时做了转换

redis 字典的值只能是字符串,这点可以通过自己实现序列化或者使用redisson 封装的数据结构存储
DTO 和BO

java 的rehash 一次性全部rehash

redis 追求高性能 采用渐进的rehash
在rehash 的同时 保留新旧两个hash 结构 ,查询时会同时查询两个hash ,在后续的定时任务和hash操作中 旧 hash 的内容会一点点迁移到新的hash 中,迁移完毕 新的hash 会取代旧hash

2.3 Set

相当于 Java中的HashSet,内部键值对 无序,唯一。 内部相当于一个特殊的字典,所有的value都是null

,当集合中的最后一个元素被移除之后,数据结构被自动删除,内存被回收。

SET 可以存储中奖用户Id 可以去重,或者存储抢票队列,保证同一个用户不会中奖两次。

2.4 Zset

常见考察点

类似Java中的sortedSet 和HashMap
的结合体。

内部是一个hash 但是value 是一个score

代表这个value 的排序权重,内部实现是一个跳跃表

2.5 List

redis 的列表相当于Java语言的LinkedList 链表不是数组
redis list的插入和删除操作非常快,时间复杂度 O(1)
但是定位索引很慢。

常用来做异步队列使用,需要处理的BO 序列化成字符串保存在redis LIST

LIST 通过命令可以实现 队列和栈

redis 的list 底层不是一个linkedList 是一个 quickList 结构

,在元素较少的时候会使用一个连续的内存存储, zipList 压缩列表。所有的元素彼此挨在一起存储。分配的是一块连续的内存。
数据量较多的时候改成 quicklist

链表+ziplist 结合组成quicklist

双向指针串起来。

此处 redis的是分配内存,内存的需要的时候 向操作系统申请。
memcached 内存是初始化申请, 的自己管理内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值