Redis相关概念、五种数据类型

介绍Redis的五种主要数据结构:字符串、哈希、列表、集合和有序集合,及其应用场景,如在线人数统计、用户属性存储、消息队列、独立IP统计和积分排行榜。

REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value的非关系型数据库,并提供多种语言的API。

被称为数据结构服务器。

它的值(value)可以是很多种类型,其中最常见的5种类型是:字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)。

一、字符串

字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,一般来存字符串,整数和浮点数。Value最多可以容纳的数据长度为512MB

应用场景:很常见的场景用于统计网站访问数量,当前在线人数等

二、哈希(Map)

Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。
应用场景:例如存储、读取、修改用户属性(name,age,pwd等)

三、列表(list)

Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。
应用场景:1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)

四、集合(sets)

edis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。

应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

五、有序集合(sorted sets)

和set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是卫衣的,但是分数(score)却可以重复。
应用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息。

Redis特点

1、Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

2、Redis 与其他 key - value 缓存产品相比有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

1、性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

2、丰富的数据类型 – Redis支持 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

3、原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

4、丰富的特性 – Redis 还支持 publish/subscribe, 队列,key 过期等等特性。

Redis对象类型简介

Redis是一种key/value型数据库,其中,每个key和value都是使用对象表示的。 比如,我们执行以下代码:

redis> SET message "hello redis"

其中的key是message,是一个包含了字符串"message"的对象。而value是一个包含了"hello redis"的对象。 Redis共有五种对象的类型,分别是:

Redis中的一个对象的结构体表示如下:

typedef struct redisObject {

// 类型
 unsigned type:4;
// 编码方式
unsigned encoding: 4;
 //引用计数
int refcount;
// 指向对象的值
void *ptr; 
} robj;

type表示了该对象的对象类型,即上面五个中的一个。但为了提高存储效率与程序执行效率,每种对象的底层数据结构实现都可能不止一种。encoding就表示了对象底层所使用的编码。

Redis对象底层数据结构:

编码常亮                                                                      编码所对应的底层数据结构

REDIS_ENCODING_INT                                                      long类型的整数

REDIS_ENCODING_EMBSTR                                            embstr编码的简单动态字符串

REDIS_ENCODING_RAW                                                   简单动态字符串

REDIS_ENCODING_HT                                                      字典

REDIS_ENCODING_LINKENDLIST                                    双端链表

REDIS_ENCODING_ZIPLIST                                              压缩列表

REDIS_ENCODING_INTSET                                              整数集合

REDIS_ENCODING_SKIPLIST                                           跳跃表和字典

### Redis 支持的五种数据类型 #### 1. 字符串 (String) 字符串是最基本的数据类型,在 Redis 中,字符串可以是纯文本形式也可以是二进制安全的。除了作为普通的键值对存储外,还可以执行一些额外的操作,比如设置过期时间和原子性的递增/递减数值。 ```python SET key value # 设置指定key对应的value GET key # 获取指定key对应的value INCR key # 将key所储存的值加一 DECR key # 将key所储存的值减一 ``` 这种类型的性能非常高效,因为所有的操作都是 O(1),即常数时间内完成[^1]。 #### 2. 列表 (List) 列表是以链表的形式来保存一组按顺序排列的字符串元素。可以通过命令向列表两端添加新成员或将现有成员弹出。这对于构建队列或栈非常有用。 ```python LPUSH mylist "item1" # 向mylist左侧插入项目 RPUSH mylist "item2" # 向mylist右侧插入项目 LPOP mylist # 移除并返回mylist的第一个元素 RPOP mylist # 移除并返回mylist最后一个元素 LRANGE mylist start stop # 返回mylist中start到stop之间的元素 ``` 由于内部实现了双向链表结构,所以即使是在大型列表里也能快速访问头部和尾部节点。 #### 3. 集合 (Set) 集合是一组无序且不重复的字符串项组成的容器。提供了诸如交集、并集以及差集等丰富的集合运算功能。非常适合用来做唯一性验证或者社交网络中的好友关系管理等工作。 ```python SADD userset user1 # 添加一个member到set中 SMEMBERS userset # 查看整个set的内容 SISMEMBER userset member # 测试某个member是否存在于此set内 SINTER set1 set2 # 计算两个sets之间共同拥有的members ``` 这些操作大多能在平均情况下达到O(n)复杂度级别,其中n代表参与计算的最大集合大小[^5]。 #### 4. 哈希表 (Hash) 哈希表由字段(field)-值(value)对构成,类似于其他编程语言里的字典(Dictionary)/关联数组(Associative Array)概念。适用于表示对象属性及其对应值的关系模型。 ```python HSET person name "Alice" # 给person这个hash增加name->"Alice" HGET person name # 取得person hash下的name field对应的value HMSET person age 28 city BJ # 批量更新多个fields-values组合 HGETALL person # 获得所有field-value对 ``` 当涉及到大量记录时,相比于直接使用大量的独立keys更加节省空间,并且提高了批量处理效率[^2]。 #### 5. 有序集合 (Sorted Set) 有序集合不仅能够保持成员的独特性和不可变性,还能按照分数(score)来进行排序展示。因此非常适合于排行榜之类的场景应用。 ```python ZADD leaderboard 90 playerA # 插入playerA的成绩为90分 ZRANK leaderboard playerB # 查询playerB在整个leaderboard上的位置 ZSCORE leaderboard playerC # 得知playerC的具体得分情况 ZRANGEBYSCORE leaderboard min max # 提取score介于min-max范围内的players名单 ``` Redis 使用跳跃表(Skip List)而非传统意义上的平衡树(Balanced Tree)实现该特性,从而简化了算法逻辑的同时也保证了高效的查找速度[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值