Redis 基本类型

本文详细介绍了Redis中的五种数据类型:String、List、Hash、Set和Sorted Set的特点及常用命令,通过实例展示了每种数据类型的应用场景。

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

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


  • string

127.0.0.1:6379> set mykey somevalue
OK
127.0.0.1:6379> get mykey
"somevalue"
127.0.0.1:6379> 

可以SET和GET命令来创建和检索strings。注意,set命令将取代现有的任何已经存在的key。SET命令还有一个提供附加参数的选项,我们能够让SET命令只有在没有相同key的情况下成功,反之亦然,可以让SET命令在有相同key值得情况下成功。
127.0.0.1:6379> set mykey newval nx
(nil)
127.0.0.1:6379> get mykey
"somevalue"
127.0.0.1:6379> 
127.0.0.1:6379> set mykey newval xx
OK
127.0.0.1:6379> get mykey
"newval"

string是Redis的基本类型,也可以对其进行一些有趣的操作,例如加法器:
127.0.0.1:6379> set counter 100
OK
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incr counter
(integer) 102
127.0.0.1:6379> incrby counter 50
(integer) 152

INCR命令让the value 成为一个整数,运行一次INCR便+1。INCRBY命令便是一个加法运算。类似的命令如减法运算为: DECR and DECRBY。

Redis可以运用MSET and MGET 命令完成一次性的完成多个key-value的对应关系,使用MGET命令,Redis返回一个value数组


127.0.0.1:6379> mset a 10 b 20 c 30
OK
127.0.0.1:6379> mget a b c
1) "10"
2) "20"
3) "30"
127.0.0.1:6379> 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • list

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素导头部, 而 RPUSH插入一个新元素导尾部.当一个这两个操作在一个空的Key上被执行的时候一个新的列表被创建。相似的,如果一个列表操作清空一个列表那么对应的key将被从key空间删除。这是非常方便的语义,因为他们被调用使用一个空列表完全就像他们被调用时使用一个不存在的键值(可以)做为参数。

PUSH一类的命令的返回值为list的长度。一些类表操作和结果的例子:


127.0.0.1:6379> rpush mylist A
(integer) 1
127.0.0.1:6379> rpush mylist B
(integer) 2
127.0.0.1:6379> lpush mylist first
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
127.0.0.1:6379> 

注意:LRANGE 利用了两个检索值,0表示list的开头第一个,-1表示list的倒数第一个,即最后一个。-2则便是list的倒数第二个,以此类推。

这些命令都是可变的命令,也就是说你可以一次加入多个元素放入list。

127.0.0.1:6379> RPUSH mylist 1 2 3 4 5 "hello"
(integer) 9
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "hello"
127.0.0.1:6379> 

在Redis的命令操作中,还有一类重要的操作:POP,取出list元素。和PUSH操作类似,POP命令可以选择不同的方向取出元素.POP命令返回值为取出的元素。
127.0.0.1:6379> rpush mylist a b c 
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> LRANGE mylist 0 -1 
1) "a"
2) "b"
127.0.0.1:6379> lpop mylist
"a"
127.0.0.1:6379> LRANGE mylist 0 -1 
1) "b"
127.0.0.1:6379> 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • hashes

Redis Hashes是字符串字段和字符串值之间的映射,因此他们是展现对象的完美数据类型。 (例如:一个有名,姓,年龄等等属性的用户):一个带有一些字段的hash仅仅需要一块很小的空间存储,因此你可以存储数以百万计的对象在一个小的Redis实例中。 哈希主要用来表现对象,他们有能力存储很多对象,因此你可以将哈希用于许多其他的任务。
127.0.0.1:6379> hmset user:1000 username liubo age 20 money 100 //创建记录,相等于数据库表一条记录
OK
127.0.0.1:6379> hget user:1000 username//获取值,记录的字段名对应的值
"liubo"
127.0.0.1:6379> hget user:1000 money
"100"

HMSET命令设置一个多域的hash表,HGET命令获取指定的单域,HGETALL命令获取指定key的所有信息。HMGET类似于HGET,只是返回一个value数组。
127.0.0.1:6379> hmget user:1000 username age money
1) "liubo"
2) "20"
3) "100"
127.0.0.1:6379> hgetall user:1000
1) "username"
2) "liubo"
3) "age"
4) "20"
5) "money"
6) "100"
127.0.0.1:6379> 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • set

无序集合

Redis 集合(Set)是一个无序的字符串集合. 你可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在。 Redis 集合拥有令人满意的不允许包含相同成员的属性。多次添加相同的元素,最终在集合里只会有一个元素。 实际上说这些就是意味着在添加元素的时候无须检测元素是否存在。 一个Redis集合的非常有趣的事情是他支持一些服务端的命令从现有的集合出发去进行集合运算,因此你可以在非常短的时间内进行合并(unions), 求交集(intersections),找出不同的元素(differences of sets)。


127.0.0.1:6379> sadd myset 1 2 3 
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> 

SADD命令产生一个无序集合,返回集合的元素个数。SMEMBER用于查看集合。

SISMEMBER用于查看集合是否存在,匹配项包括集合名和元素个数。匹配成功返回1,匹配失败返回0.

127.0.0.1:6379> SISMEMBER myset 3
(integer) 1
127.0.0.1:6379> SISMEMBER myset 30
(integer) 0


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • zset

有序集合

Redis有序集合与普通集合非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的没有成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。 使用有序集合你可以以非常快的速度(O(log(N)))添加,删除和更新元素。因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。在有序集合中,你可以很快捷的访问一切你需要的东西:有序的元素,快速的存在性测试,快速访问集合的中间元素! 简而言之使用有序集合你可以做完成许多对性能有极端要求的任务,而那些任务使用其他类型的数据库真的是很难完成的。 

ZADD与SADD类似,但是在元素之前多了一个参数,这个参数便是用于排序的。形成一个有序的集合。

查看集合ZRANGE是查看正序的集合,ZREVRANGE是查看反序的集合。0表示集合第一个元素,-1表示集合的倒数第一个元素。


127.0.0.1:6379> zadd myzset 20 liubo
(integer) 1
127.0.0.1:6379> zadd myzset 22 hello
(integer) 1
127.0.0.1:6379> zadd myzset 20 nice 
(integer) 1
127.0.0.1:6379> zadd myzset 0.1 welcome
(integer) 1
127.0.0.1:6379> ZRANGE myzset 0 -1 
1) "welcome"
2) "liubo"
3) "nice"
4) "hello"
127.0.0.1:6379> ZREVRANGE myzset 0 -1
1) "hello"
2) "nice"
3) "liubo"
4) "welcome"
127.0.0.1:6379> 


使用WITHSCORES 参数返回记录值。
127.0.0.1:6379> ZREVRANGE myzset 0 2  withscores //返回分数最高的前三名, 显示分数参数
1) "hello"
2) "22"
3) "nice"
4) "20"
5) "liubo"
6) "20"
127.0.0.1:6379> 


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
### Redis基本数据类型的底层实现原理 Redis 是一种高性能的键值存储系统,其底层实现依赖于多种数据结构和编码方式,这些设计使得 Redis 在内存使用效率和数据操作性能之间取得了良好的平衡。以下是 Redis 基本数据类型的底层实现详解: #### 1. **String 类型** String 是 Redis 最基础的数据类型,其实现基于两种编码方式:`int` 和 `embstr`/`raw`。 - 当字符串值可以表示为整数时,Redis 使用 `int` 编码来存储该值[^3]。 - 对于较小的字符串(通常小于 44 字节),Redis 使用 `embstr` 编码,这是一种优化后的编码方式,将字符串对象和值合并为一个连续的内存块,减少了内存分配次数[^2]。 - 对于较大的字符串或动态变化的字符串,Redis 使用 `raw` 编码,允许字符串值动态扩展。 ```c // 示例:Redis 中 String 的实现 struct redisObject { unsigned type:4; // 数据类型标识 unsigned encoding:4; // 编码方式 void *ptr; // 指向实际数据的指针 }; ``` #### 2. **List 类型** List 类型Redis 中通过双端链表(`linked list`)或压缩列表(`ziplist`)实现。 - 当列表元素较少且每个元素较小时,Redis 使用 `ziplist` 编码以节省内存。 - 当列表元素较多或元素较大时,Redis 转而使用 `linkedlist` 编码,其中每个节点包含一个指向下一个节点的指针[^3]。 ```python # 示例:操作 Redis List 类型 db.ListLeftPush("mylist", "world") # 插入到列表左侧 db.ListRightPush("mylist", "!") # 插入到列表右侧 ``` #### 3. **Hash 类型** Hash 类型用于存储键值对集合,其底层实现基于哈希表(`hashtable`)或压缩列表(`ziplist`)。 - 当 Hash 中的字段和值较少时,Redis 使用 `ziplist` 编码以减少内存开销[^2]。 - 当字段和值增多时,Redis 切换到 `hashtable` 编码,提供更高效的查找和插入性能[^3]。 #### 4. **Set 类型** Set 类型用于存储无序且唯一的元素集合,其底层实现基于整数集合(`intset`)或哈希表(`hashtable`)。 - 如果 Set 中的所有元素都是整数且数量较少,Redis 使用 `intset` 编码,这是一种紧凑的整数集合实现[^2]。 - 如果 Set 包含非整数元素或元素数量较多,Redis 使用 `hashtable` 编码[^3]。 #### 5. **Sorted Set 类型** Sorted Set 是一种有序集合,其底层实现基于跳跃表(`skiplist`)和字典(`dict`)。 - 跳跃表用于按分值排序的快速范围查询。 - 字典用于快速查找特定成员的分值[^2]。 ```c // 示例:Redis 中 Sorted Set 的实现 typedef struct zset { dict *dict; // 用于快速查找成员 zskiplist *zsl; // 用于按分值排序的跳跃表 } zset; ``` ### 总结 Redis基本数据类型通过灵活选择不同的编码方式,在内存占用和性能之间实现了良好的权衡。理解这些底层实现有助于开发者更好地优化 Redis 的使用场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值