Redis的使用和原理

目录

1.初识Redis

[1.1 Redis是什么?](#1.1 Redis是什么?)

[1.2 Redis的特性](#1.2 Redis的特性)

[1.2.1 速度快](#1.2.1 速度快)

[1.2.2 基于键值对的数据结构服务器](#1.2.2 基于键值对的数据结构服务器)

[1.2.3 丰富的功能](#1.2.3 丰富的功能)

[1.2.4 简单稳定](#1.2.4 简单稳定)

[1.2.5 持久化](#1.2.5 持久化)

[1.2.6 主从复制](#1.2.6 主从复制)

[1.2.7 高可用和分布式](#1.2.7 高可用和分布式)

[1.3 Redis的使用场景](#1.3 Redis的使用场景)

[1.3.1 缓存](#1.3.1 缓存)

[1.3.2 排行榜系统](#1.3.2 排行榜系统)

[1.3.3 计数器应用](#1.3.3 计数器应用)

[1.3.4 社交网络](#1.3.4 社交网络)

[1.3.5 消息队列](#1.3.5 消息队列)

2.Redis常见的数据类型

[2.1 基本全局命令](#2.1 基本全局命令)

[2.1.1 KEYS](#2.1.1 KEYS)

[2.1.2 EXISTS](#2.1.2 EXISTS)

[2.1.3 DEL](#2.1.3 DEL)

[2.1.4 EXPIRE](#2.1.4 EXPIRE)

[2.1.5 TTL](#2.1.5 TTL)

[2.1.6 TYPE](#2.1.6 TYPE)

[2.2 数据结构和内部编码](#2.2 数据结构和内部编码)


1.初识Redis

1.1 Redis是什么?

Redis是一个在内存中存储数据的中间件,用于作为数据库,用于作为数据缓存,在分布式系统中有很大的用处,由于Redis将所有的数据存储在内存中,所以Redis的读写性能非常高效

1.2 Redis的特性

1.2.1 速度快

1)Redis数据存储在内存中,所以就比访问硬盘的数据库快很多

2)Redis的核心功能都是比较简单的操作内存的数据结构

3)从网络的角读看,Redis使用了IO多路复用的方式,一个线程管理多个socket

4)Redis使用了单线程模型,减少了不必要的线程之间的竞争开销

1.2.2 基于键值对的数据结构服务器

Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由String、hash、list、set、zset(有序集合)、Bitmaps(位图)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景

1.2.3 丰富的功能

除了5中数据结构,Redis海提供了许多额外的功能:

1)提供了键过期功能,可以用来实现缓存

2)提供了发布订阅功能,可以用来实现消息系统

3)支持Lua脚本功能,可以利用Lua创建出新的Redis命令

4)提供了简单的事务功能,能在一定程度上保证事务特性

5)提供了流水线功能,客户端能将一批命令一次性传到Redis,减少了网络的开销

1.2.4 简单稳定

Redis的简单主要表现在三个方面,首先,Redis的源码很少,相对于很多NoSQL数据库来说代码量相对要少很多。其次,Redis使用单线程模型,使得Redis服务端处理模型变得简单。最后,Redis不需要依赖其他操作系统中的类库,自己实现了事件处理的相关功能

1.2.5 持久化

通常看,将数据放在内存中不安全,一旦发生断电,重要的数据可能就会丢失,因此Redis提供了两种持久化的方式:RDB和AOF,使用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久化

1.2.6 主从复制

Redis提供了复制功能,实现了多个相同的Redis副本,复制功能是分布式Redis的基础

1.2.7 高可用和分布式

Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障自动转移,也提供了Redis集群(Redis Cluster),是真正的分布式实现,提供了高可用、读写和容量的扩展性

1.3 Redis的使用场景

1.3.1 缓存

缓存机制几乎在所有的网站都有使用,合理的使用缓存可以加速数据的访问速度,Redis提供了键值对过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略

1.3.2 排行榜系统

Redis提供了列表和有序集合的结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统

1.3.3 计数器应用

在视频网站中,每播放一次视频播放量就加1,如果并发量很大对于传统关系型数据的性能是⼀种挑战,Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择

1.3.4 社交网络

由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能

1.3.5 消息队列

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,对于一般的消息队列功能基本可以满足

2.Redis常见的数据类型

2.1 基本全局命令

Redis由5中数据结构,它们都是键值对中的值,对于键来说有一些通用的命令

2.1.1 KEYS

返回所有满足样式的key,例如

h?llo匹配hello,hallo和hxllo,?匹配任意一个字符

h*llo匹配hllo,hello,heeeello,*匹配0个或者多个任意字符

h[ae]llo匹配hello和hallo,[ae]只能匹配a和e

h[^e]匹配hallo,hxllo,[^e]排除e,其他都能匹配

h[a-b]llo匹配hallo和hbllo,只匹配a-b之间的范围,包含两侧边界

keys的时间复杂度是O(N),其中keys *(查询redis中的所有key)

2.1.2 EXISTS

判断某个key是否存在

时间复杂度:O(1)

返回值:key存在的个数

2.1.3 DEL

删除指定的key

时间复杂度:O(1)

返回值:删除掉key的个数

2.1.4 EXPIRE

为指定的key添加秒级的过期时间,key存活时间超过指定的值就会被自动删除

时间复杂度:O(1)

返回值:1表示设置成功,0表示设置失败

2.1.5 TTL

获取指定key的过期时间,秒级

时间复杂度:O(1)

返回值:剩余时间。-1表示没有关联过期时间,-2表示key不存在

2.1.6 TYPE

返回key对应的数据类型,Redis的所有key都是String,key对应的value可能会存在多种类型

时间复杂度:O(1)

返回值:none,string,list,set,zset,hash,stream

总结:

keys:用来查看匹配规则的key

exists:用来判定指定key是否存在

del:删除指定的key

expire:给key设置过期时间

ttl:查询key的过期时间

type:查询key对应的value的类型

2.2 数据结构和内部编码

type命令实际返回的就是当前键的数据结构类型,它们分别是:String、list、hash、set、zest,这些只是Redis对外的数据结构

Redis数据结构和内部编码

String

raw:最基本的字符串

int:redis通常也可以用来实现一些"计数"功能,当value是一个整数的时候,此时可能redis会直接使用int来保存

embstr:针对短字符串进行的特殊优化

hash

hashtable:最基本的哈希表

ziplist:压缩列表,当哈希表里面的元素比较少时,可能就优化成ziplist,从而节省空间

list

linkedlist:链表

ziplist:压缩列表

从Redis3.2开始,引入新的实现方式quicklist,它同时兼顾了linkedlist和ziplist的优点,其中quicklist就是一个链表,每个元素又是一个ziplist,兼顾到时间和空间

set

intset:集合中存的都是整数

zset

skiplist:跳表

上述每种数据结构都有至少两种以上的内部编码实现,其中可以通过object encoding命令来查询内部编码

hello对应值的内部编码时embstr,mylist对应值的内部编码时ziplist

Redis这样设计有两个好处:

1)可以改进内部编码,而对外的数据结构和命令没有任何影响,因此一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,形成了高内聚低耦合,例如Redis3.2提供了quicklist,它是结合了ziplist和linkedlist两者的优点,为列表类型提供了一种更为优秀的内部编码实现,用户是感知不到的

2)多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为

linkedlist,整个过程用户也感知不到

相关推荐
守护者1708 分钟前
JAVA学习-练习试用Java实现“使用Arrays.toString方法将数组转换为字符串并打印出来”
java·学习
源码哥_博纳软云10 分钟前
JAVA同城服务场馆门店预约系统支持H5小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
禾高网络12 分钟前
租赁小程序成品|租赁系统搭建核心功能
java·人工智能·小程序
学会沉淀。17 分钟前
Docker学习
java·开发语言·学习
如若12319 分钟前
对文件内的文件名生成目录,方便查阅
java·前端·python
PyAIGCMaster20 分钟前
文本模式下成功。ubuntu P104成功。
服务器·数据库·ubuntu
xo1988201127 分钟前
鸿蒙人脸识别
redis·华为·harmonyos
drebander33 分钟前
MySQL 查询优化案例分享
数据库·mysql
初晴~1 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581361 小时前
InnoDB 的页分裂和页合并
数据库·后端