十分钟全面了解Redis

本文全面探讨Redis的六种数据结构,包括SDS、quicklist、intset、hasttable、ziplist和skiplist。此外,详细介绍了Redis的五种数据类型及其用途,如String、List、Set、Sorted Set和Hash。讨论了Redis的速度优势、过期删除策略、淘汰策略、持久化方式(RDB和AOF)以及如何应对缓存问题。最后,涉及了Redis的高可用方案、发布与订阅、事务和位数组以及HyperLogLong等高级特性。
摘要由CSDN通过智能技术生成

目录

Redis六种数据结构

SDS

SDS特点

quicklist

链表特点 

intset

hasttable

ziplist

skiplist

Redis五种数据类型

String

常见命令

List

常见命令 

数据结构      

Set

常见命令 

数据结构

 什么时候使用intset

Sorted Set

常见命令     

数据结构 

Hash

常见命令     

数据结构

 什么时候使用ziplist

为什么Redis这么快

Redis过期删除策略

Redis淘汰策略 

Redis持久化方式有哪些

RDB

AOF

Redis缓存可能存在问题

缓存击穿

解决方案

缓存穿透 

解决方案

 缓存雪崩

 解决方案:

Redis高可用方案

Sentinel

Cluster

MOVE

ASK

发布与订阅

订阅

退订

发布消息     

事物

事务的实现

WATCH 

位数组

HyperLogLong


Redis六种数据结构

通过 object encoding key可以查看key的数据结构  

127.0.0.1:6379> object encoding test

"quicklist"  

SDS

     Redis中创建了一种名为简单动态字符串(Simple Dynamic String,SDS) 作为字符串的默认数据结构。

SDS特点

  1. 获取字符串长度的时间复杂度为O(1)
  2. 杜绝缓冲区溢出
  3. 减少因修改字符串长度时所需的内存分配次数
  4. 二进制安全

quicklist

链表特点 

        链表被广泛用于实现Redis各种功能,比如发布与订阅等;他的主要特点有:

  1. 每个链表节点有一个ListNode结构表示,每个节点都有一个指向前置节点和后置节点的指针,所以Redis的链表是双端链表
  2. 每个链表使用一个list结构表示,这个结构有表头指针、表尾指针以及长度信息等
  3. 链表头节点的前置节点为null链表的尾节点的后置节点都指向NULL,所有Redis链表是无环链表 

intset

hasttable

ziplist

skiplist

Redis五种数据类型

        Redis是一种高级的key-value非关系内存数据库,支持五种数据类型:

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M 缓存
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

String

        String是Redis常用的数据类型,典型使用场景有 缓存对象、常规计数以及分布式锁

常见命令

命令 作用 示例
set 用于给指定的key 设置指定值

127.0.0.1:6379> set message "hello word"  ex 1000

OK

get 获取指定key的值

127.0.0.1:6379> get message

"hello word"

incr 自增

127.0.0.1:6379> incr number

(integer) 2

incrby 按照指定步长进行自增

127.0.0.1:6379> incrby number 3

(integer) 5

decr 自减

127.0.0.1:6379> decr number

(integer) 4

decrby 按照指定步长自减

127.0.0.1:6379> decrby number 3

(integer) 1

strlen 获取指定key的值的长度

127.0.0.1:6379> strlen message

(integer) 10

append 向指定key的值追加数据

127.0.0.1:6379> append message  " redis"

(integer) 16

127.0.0.1:6379> get message

"hello word redis"

127.0.0.1:6379>

getrange 按照指定范围从指定key中获取数据

127.0.0.1:6379> GETRANGE message 0 5

"hello "

setrange 将字符串特定索引上的值设置为指定的数据

127.0.0.1:6379> set message "hello word"

OK

127.0.0.1:6379> setrange message 6 "redis"

(integer) 11

127.0.0.1:6379> get message

"hello redis"

List

 列表在Redis中实现上不是使用数据而是使用链表。典型使用场景是消息队列

常见命令 

命令 含义 示例
lpush 将一个或多个值插入到列表头

127.0.0.1:6379> lpush mylist "hello"

(integer) 3

rpush 将一个或多个值插入到列表尾部

127.0.0.1:6379> rpush mylist "hello" "word" "hello" "redis"

(integer) 4

lpop 移除并返回列表的第一个元素

127.0.0.1:6379> lpop mylist

"hello"

rpop 移除并返回列表最后一个元素

127.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈脩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值