Redis——另一种数据库

Redis是一种内存数据库,以其高速度、原子性、丰富的数据类型等优点被广泛使用。它可以作为会话缓存、全页缓存、消息队列、排行榜/计数器以及发布/订阅系统。Redis支持五种数据类型:String、List、Hash、Set和SortedSet,其中String是最基础的类型,支持二进制安全存储;List可以进行双向链表操作;Hash用于键值对存储;Set是无序不重复的集合;SortedSet是有序集合,根据score排序。此外,Redis还提供了HyperLogLog结构用于基数统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近与同学聊天过程时,两人聊到了Redis,很诧异于该同学对redis方面知识的匮乏,便对Redis做一个简略的总结

Redis是什么

  • redis是一种支持Key-Value等多种数据结构的存储系统

数据库我们都知道,也都非常熟悉mysql数据库的使用,于是会想当然的认为数据库都是同源的,在这种想法下,会对Redis不以为然,这样,在工作时,将会对其手足无措,由于在工作中的需要,我们需要对Redis有一定的了解

Redis优点

既然已经有了形形色色的数据库,那为什么还要用到redis呢
redis主要有以下几个脱颖的地方:

  1. 速度快
    数据直接储存在内存中,读写都有着特别高的性能
  2. 原子性
    Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
  3. 丰富的数据类型
    支持string,list,set,sorted set,hash
  4. 其他丰富的特性
    可用于缓存,消息,按key设置过期时间,过期后将会自动删除

Redis用处

Redis有如此多的优点,我们能用其来做什么呢

  1. 会话缓存(Session Cache)
    最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储的优势在于:Redis提供持久化。

  2. 全页缓存(FPC)
    除基本的会话之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进。

  3. 队列
    Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言对 list 的 push/pop 操作。

  4. 排行榜/计数器
    Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。

  5. 发布/订阅
    最后是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!

Redis的数据类型及其使用

当然,仅仅知道Redis是什么是远远不够的,我们也必须知道Redis怎么使用
首先,Redis有5种数据类型:

  1. string:存储字符串(最基础的数据类型,二进制的文件(图片、视频))
  2. list:是一个集合,可以在头部或者尾部操作数据
  3. hash(Map):采用键值对存储
  4. set:无序不可重复的集合
  5. SortedSet:使用score来排序的集合
  6. HyperLogLog:redis2.8.9版本之后才有,用来做基数统计的算法
String类型

最为基础的数据存储类型。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

redis中没有使用C语言的字符串表示,而是自定义一个数据结构叫SDS(simple dynamic string)即简单动态字符串。
打开下载的redis源码包,找到src下的sds.h文件查看sds源码:

struct sdshdr {
//字符串长度
unsignedint len;
//buf数组中未使用的字节数量
unsignedint free;
//用于保存字符串
char buf[];
};

c语言对字符串的存储是使用字符数组,遇到’\0’字符则认为字符串结束,
redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的char buf[]就是存储了二进制数据。

redis的字符串是二进制安全的,什么是二进制安全?简单理解就是存入什么数据取出的还是什么数据。
redis中的sds不像c语言处理字符串那样遇到’\0’字符则认证字符串结束,
它不会对存储进去的二进制数据进行处理,存入什么数据取出还是什么数据。
常用的命令

命令含义使用示例
Set赋值语句Set k v
Get获取值Get k
Append追加字符串Append k v
DECR自减值DECR k
INCR自增值INCR k
List类型

List类型是按照插入顺序排序的字符串链表。可以在链表的两头插入或删除元素,List中可以包含的最大元素数量是4294967295。
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。
这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。

常用的命令

命令含义使用示例
LPUSH左侧插入LPUSH k v1 v2 v3……
RPUSH右侧插入RPUSH k v1 v2 v3……
LPOP左侧弹出LPOP k
RPOP右侧弹出RPOP k
LLEN链表长度LLEN k
hash类型

hash叫散列类型,它提供了字段和字段值的映射。
字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

Hash类型可以看成具有StringKey和StringValue的map容器。非常适合于存储值对象的信息。如Username、Password和Age等。

常用的命令

命令含义使用示例
HSET给k中某字段赋值HSET k f v
HGET获取k中某字段的值GSET k f
SET类型

集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,
由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)
Set类型看作为没有排序的字符集合,Set集合中不允许出现重复的元素

常用的命令

命令含义使用示例
SADD增加元素SADD k member1 member2……
SREM删除元素SREM k member1 member2……
SMEMBERS遍历元素SMEMBERS k
Sortedset(zset)

在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,
这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,
还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
在某些方面有序集合和列表类型有些相似。
1、二者都是有序的。
2、二者都可以获得某一范围的元素。

但是,二者有着很大区别:
1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
4、有序集合要比列表类型更耗内存

常用命令

命令含义使用示例
zadd增加元素(附带分数)zadd k s1 m1 s2 m2 ……
zcount获取值在分数段间的成员数zcount k min max
zrange获取某分数段间的成员(升序)zrange k start stop [WITHSCORES]
zrem删除元素zrem k m1 m2 ……
HyperLogLog

Hyperloglog是一种使用随机算法进行基数估计的结构
能高效率的计算基数的估计值(空间复杂度一定)
需要注意的是,HyperLogLog并不会储存元素,只是储存元素的基数

常用命令

命令含义使用示例
pfadd增加元素pfadd k m1 m2 ……
pfcount返回基数估算值k1 k2 k3……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值