Redis中的数据结构

用74LS161芯片做个简易秒表:从芯片引脚到电路搭建的保姆级教程 本文详细介绍了如何使用74LS161芯片搭建简易秒表的完整过程,从芯片引脚功能解析到电路设计、分频计算和实际搭建步骤。通过时序逻辑电路和计数器的应用,读者可以学习如何将高频时钟分频为秒脉冲,并驱动数码管显示。教程包含关键参数计算、接线示意图、调试技巧及功能扩展方案,是数字电路实践的理想入门项目。 阅读详情

一、Redis概述


如今,互联网项目越来越青睐 Redis。

Redis 是一种基于内存的数据库。因为是面向内存,所以其读写性能要远优秀于面向磁盘的数据库。这也是在高并发场景下,Redis 发挥其作用的主要原因。


Redis

二、5种数据类型

Redis 是一种键值(key-value)数据库。这是理解其数据结构的关键。因为任何存放在 Redis 数据库中的数据都是以这种形式存在的。

在 Redis 中,Key 是一个简单的 String。Key 的长度没有限制,但是减小 Key 的长度可以有效的节约内存,也更有利于 Key 检索的效率。

而在 Redis 中,Value 则有 5 种数据类型。除了基本类型 String 外,还有 List、Hash、Set、Zset 四种数据类型。

1、String

字符串是 Redis 中最基本的数据类型,也是 Redis 中默认的数据类型。
下面是 String 种常用的命令。

127.0.0.1> set key1 value1 //向Redis中新增一个键值对
OK
127.0.0.1> get key1 //获得该键指向的字符串的值
"value1"
127.0.0.1> strlen key1 //获得该键指向的字符串的长度
(integer) 6
127.0.0.1> getset key1 newvalue //将该键指向字符串设为新值,返回旧值
"value1"
127.0.0.1> get key1 //测试上面的命令是否成功
"newvalue"
127.0.0.1> getrange key1 3 7 //获取该键指向字符串的子串,范围为0~len
"value"
127.0.0.1> append key1 more //向该键指向字符串后添加新串,返回总长度
(integer) 12
127.0.0.1> get key1  //测试上面命令是否成功
"newvaluemore"

Redis 还提供对整数和浮点数的简单运算,命令如下。

127.0.0.1> set key1 10 //向Redis中新增键值对
OK
127.0.0.1> incr key1 //对该键所指向的值,做加1运算
(integer) 11
127.0.0.1> incrby key1 10 //对该键所指向的值,加上指定的整数
(integer) 21
127.0.0.1> decr key1 //对该键所指向的值,做减1运算
(integer) 20
127.0.0.1> decrby key1 10 //对该键所指向的值,减去指定的整数
(integer) 10

这里要注意的是如果 value 值为浮点数,以上四个命令都会失败。想要操作浮点数,可以使用下面的命令。

127.0.0.1> set key1 1.1
OK
127.0.0.1> incrbyfloat key1 1.1 //这个命令对浮点数和整数都适用
"2.2"

可以看到,Redis 中自带的运算功能是比较弱的。不过 Redis 中提供 Lua 语言的支持,这是 Redis 扩展功能中最强大的一个地方。

2、List

Redis中的 List 是一个双向链表结构,也是一个有序的线性结构。所以它的优缺点也是十分明显的,优点就是:

  • 插入和删除很方便

而其缺点:

  • 查找性能很弱

由于是双向链表,所以 List 结构的命令分为左操作和右操作两种,示例如下。

127.0.0.1> lpush left_key node_1 node_2 node_3 //链表逆序加入节点
(integer) 3
127.0.0.1> lrange left_key 0 2 //查看链表中下标从0到2的节点值
1) "node_3"
2) "node_2"
3) "node_1"
127.0.0.1> rpush right_key node_1 node_2 node_3 //链表顺序加入节点
(integer) 3
127.0.0.1> lrange right_key 0 2 //查看链表中下标从0到2的节点值
1) "node_1"
2) "node_2"
3) "node_3"
127.0.0.1> lindex left_key 2 //读取指定链表中下标为2的节点,以左操作
"node_1"
127.0.0.1> llen left_key //返回指定链表的长度,以左操作
(integer) 3
127.0.0.1> lpop left_key //删除链表最左边的节点并返回
"node_3"
127.0.0.1> rpop left_key //删除链表最右边的节点并返回
"node_1"
127.0.0.1> lrange left_key 0 0 //测试上面两条命令是否生效
1) "node_2"
127.0.0.1> lpushx left_key node_1 //如果存在该链表,则在最左边
(integer) 2                       //添加一个节点,否则添加失败
127.0.0.1> rpushx left_key node_3 //如果存在该链表,则在最右边
(integer) 3                       //添加一个节点,否则添加失败
127.0.0.1> lrange left_key 0 2 //测试上面两条命令是否生效
1) "node_1"
2) "node_2"
3) "node_3"
127.0.0.1> lset left_key 0 newNode_1 //修改执行下标的节点值
OK
127.0.0.1> lrange left_key 0 2 //测试上面一条命令是否生效
1) "newNode_1"
2) "node_2"
3) "node_3"
127.0.0.1> ltrim left_key 1 1 //修剪链表,保留指定下标区间的节点
OK
127.0.0.1> lrange left_key 0 0 //测试上面一条命令是否生效
1) "node_2"

需要注意的是,对链表的操作都是进程不安全的,有可能存在多个客户端同时操作链表的情况。为了保证链表操作的安全性,Redis 提供了阻塞命令,执行阻塞命令,会给链表加锁,可是这些命令在实际开发中使用的不多,这里不做过多介绍。

3、Set

set 翻译成中文就是集合。这里的集合同数学中的集合有着相同的性质:无序、不可重复。

同 list 一样,集合中每一个元素也都是 String 数据类型。

127.0.0.1:6379> sadd set1 val1 val2 val3 val4 val5 //给键为set1的
(integer) 5                                        //集合添加成员    
127.0.0.1:6379> sadd set2 val4 val5 val6 val7 val8 //同上
(integer) 5
127.0.0.1:6379> smembers set1 //返回该键指向集合的所有成员
1) "val4"                     //从取出的成员能明显看出来集合是无序的
2) "val1"
3) "val3"
4) "val2"
5) "val5"
127.0.0.1:6379> sdiff set1 set2 //求两个集合的差
1) "val1"
2) "val3"
3) "val2"
127.0.0.1:6379> sinter set1 set2 //求两个集合的交
1) "val4"
2) "val5"
127.0.0.1:6379> sunion set1 set2 //求两个集合的并
1) "val4"
2) "val8"
3) "val7"
4) "val3"
5) "val5"
6) "val1"
7) "val6"
8) "val2"
127.0.0.1:6379> sismember set1 val1 //判断val1是否为指定集合的成员
(integer) 1
127.0.0.1:6379> smove set1 set2 val1 //把val1从set1移到set2中
(integer) 1
127.0.0.1:6379> smembers set2 //测试上一条命令是否生效
1) "val4"
2) "val5"
3) "val7"
4) "val8"
5) "val1"
6) "val6"
127.0.0.1:6379> spop set1 //随机弹出一个集合成员
"val2"
127.0.0.1:6379> spop set1 //同上
"val4"
127.0.0.1:6379> spop set1 //同上
"val3"
127.0.0.1:6379> smembers set1 //测试上面三条命令是否生效
1) "val5"

4、Zset

zset 称为有序集合。有序集合和集合相似,唯一不同的是有序集合中每一个元素还带有一个分数,可以根据这个分数来对集合成员进行排序。

下面介绍有序集合的一些常用命令。

127.0.0.1> zadd set 1 A 2 B 3 C 4 D 5 E //向有序集合中添加成员
(integer) 5
127.0.0.1> zcount set 2 4 //返回指定分数区间内的成员个数
(integer) 3
127.0.0.1> zincrby set 1 E //为指定成员增加指定分数值
"6"
127.0.0.1> zrange set 0 4 //返回指定下标区间内成员,分数从小到大排序
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"
127.0.0.1> zrank set B //返回指定成员的排名,排名从0开始
(integer) 1
127.0.0.1> zadd set 2.5 X //添加一个分数为浮点数的成员
(integer) 1
127.0.0.1> zrange set 0 5 //测试上面一条命令是否生效
1) "A"
2) "B"
3) "X"
4) "C"
5) "D"
6) "E"

5、Hash

Redis 中的 Hash 就如同 Java 中的 map 一样。这种数据类型对于某些场景非常有用:比如需要在 Redis 中存储大量的 User 信息,每个 User 包括多个属性字段。这种情况使用 Hash 结构来存储就相当方便,实例如下。

127.0.0.1> hmset user_1 id 001 age 23 sex male //设置多个键值对
OK
127.0.0.1> hgetall user_1 //获取所有的键值对
1) "id"
2) "001"
3) "age"
4) "23"
5) "sex"
6) "male"
127.0.0.1> hexists user_1 id //是否存在id字段/键
(integer) 1
127.0.0.1> hincrby user_1 age 3 //age字段/键上加3
(integer) 26
127.0.0.1> hkeys user_1 //获得所有的键
1) "id"
2) "age"
3) "sex"
127.0.0.1> hvals user_1 //获得所有的值
1) "001"
2) "26"
3) "male"
127.0.0.1> hlen user_1 //返回该hash中键值对的数量
(integer) 3
127.0.0.1> hset user_1 name mary //向该hash中新增一个键值对
(integer) 1
127.0.0.1> hgetall user_1 //测试上面的命令是否生效
1) "id"
2) "001"
3) "age"
4) "26"
5) "sex"
6) "male"
7) "name"
8) "mary"

可以看出,此时键为 user_1,而值为一个 hash 结构,该 hash 结构中又存放了多个键值对。也就是说 Redis 需要通过 user_1 这个键来索引到对应的 hash 结构,再通过 hash 结构的键找到对应的值。

Redis中的数据结构简析 Redis诞生于2009年,全称是Remote Dictionary Server,解释为远程词典服务,是一个基于内存的键值型NoSQL数据库。由于其基于内存的性质,有较快的访问速度,所以很多场景下均用其作为缓存来使用。而为了更好的发挥其性能,提升缓存的读写效率,我们是有必要了解Redis中的数据类型以及其底层的数据结构的。下面文本就以Redis中最基本的五种数据类型来分别展开讲解Redis中的数据结构。字符串类型(String)作为Redis中最简单的数据类型,也得到了最广泛的使用。 阅读详情

相关推荐

数电实验:数字电子钟设计74HC161

用四片74161构成两个六十进制计数器,再用两片构成二十四进制计数器,就可以组合成一个电子钟。本资源 是PPT,附有详细说明。

数字逻辑大作业----数字时钟

结合日常生活实际,设计制作一个可以显示时、分、秒的数字钟。24小时为一个计数周期。要求首先设计总体方案;然后设计各单元电路,画出电路原理图,并利用Multisim软件仿真调试单元电路;最后进行系统联调与测试。

qq_60737285的博客 1万+

数电课设 秒表电路图

数电课设 秒表电路图 用数字电路设计秒表。555 译码器

设计并实现计时长度为60秒的秒表(课程设计)

设计并实现计时长度为60秒的秒表,计时单位为百分秒。

热情、奔放、快乐编程! 3662

详解Redis中的双链表结构

Redis中双链表实现的基本结构: 1.节点结构 typedef struct listNode { struct listNode *prev; //前向节点 struct listNode *next; //后向节点 void *value; //该节点的值 } listNode; 2.双向链表结构 typedef struct list { listNode *head; //头节点 listNode *tail; //尾节点 void *(*dup)(void *ptr); //复制函数 void (*free)(

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

使用Multisim软件利用74LS161芯片设计60秒计数器

一.74LS161芯片基本功能简介 74LS161芯片具有二进制加法计数功能外,还具有预置数,保持和异步置零等附加功能。 结合下图我们具体分析其引脚功能: 1、 1、(1)引脚是异步置零(复位)端。当~CLR=0时所有触发器同时被置零,而且置零操作不受其他输入端状态的影响。 2、(2)引脚是计数脉冲输入端,上升沿有效。 3、(3、4、5、6)是数据输入端。 4、(7、10)是工作状态控制端(使能端...

qq_44617864的博客 5万+

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

Redis面试系列:Redis中的数据结构

Redis中的数据结构 前言 Redis是一个高性能的分布式内存数据库,在国内外个大互联网公司中都有着广泛的使用,即使是一些非互联网公司也有着非常重要的使用场景。 Redis提供了五种主要的数据类型,它提供了强大且实用的功能,然而实际开发中,有大多数的开发者仅仅只会使用简单的 Redis String的 Get和Set,下面将回顾Redis五大对象,以便能够在实战中游刃有余。 String(终究是我扛下来所有) Hash(存储对象我也行) List(栈和队列我都行) Set(标签系统我在行) Sort S

Viper的程序员修炼手册 1788

别再只设接触压力了!用ANSYS Workbench模拟O型圈密封泄漏的完整流程

本文详细介绍了在ANSYS Workbench中模拟O型圈密封泄漏的完整流程,重点解析了流体渗透压力载荷的设置与应用。通过双物理场耦合模型和精确的参数配置,帮助工程师准确评估密封性能,避免传统方法仅考虑接触压力的局限性。文章还提供了常见问题的解决方案和工程实践建议,提升密封设计的可靠性。

weixin_30372371的博客 399

Windows 11下用Ollama一键部署DeepSeek-R1大模型(附8B/14B版本选择建议)

本文详细介绍了在Windows 11环境下使用Ollama工具一键部署DeepSeek-R1大模型的完整指南,包括8B和14B版本的选择建议。通过硬件评估、安装配置、性能优化等步骤,帮助开发者高效实现本地部署,提升AI应用体验。

weixin_29079643的博客 272

redis中的数据结构

String String 常用命令 说明 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值,可以是字符串、整数或者浮点数 DEL 删除给定键值对,使用与所有数据结构类型 eg: ➜ bin ./redis-cli 127.0.0.1:6379> set name qiqj OK 127.0.0.1:6379> get name "qiqj"...

qiqj的博客 248

Nexus7二代刷机教程(新手向)

该教程将使用lineageos(Android 11),同时借鉴了lineage官方的教程和songelf的教程。

2403_84391487的博客 5211

Redis 中的 Zset 数据结构详解

Redis 中 Zset 的用法,编码,应用场景总结。

llt2997632602的博客 1884

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 558

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

Redis中的数据结构及其底层

Redis中的数据类型和结构

qq_53199639的博客 711

Python爬虫实战:高德地图POI信息爬取(餐馆/加油站等),附选址分析技巧

高德API配置AMAP_KEY = "你的高德API Key" # 替换成自己的Key# 爬取参数CITY = "成都" # 城市DISTRICTS = ["锦江区"] # 区域,可添加多个(比如["锦江区", "武侯区"])KEYWORDS_LIST = ["川菜馆", "加油站"] # 要爬取的POI类型TYPES = {"川菜馆": "050101", # 餐饮服务→中餐→川菜馆(高德POI分类编码)"加油站": "110100" # 交通设施→加油站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2469

Redis数据结构中的跳跃表

定义跳跃表(Skiplist)是一种基于并联的链表结构,用于在有序元素序列中快速查找元素的数据结构。它通过在不同层级(level)上增加指针来加速查找过程,每一层都以一定的概率选择部分元素添加额外的前向指针,这些额外的指针使得跳跃表可以快速跳过一些元素,从而加快查找速度。原理跳跃表的核心思想是通过多级索引来优化链表的查找效率。在跳跃表中,每个节点都包含多个指针,这些指针按照从低到高的层次进行排列,每一层都构成了一个有序链表。

m0_70066267的博客 502

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

redis中的5种数据结构

这里的数据结构指的是key-value中value的数据结构,分别为string、hash、list、set、sorted set。每种数据结构都有相关的命令,比如set命令表示使用string来存储value,get命令的参数只能为对应value值存储为string的key,操作其他数据结构需要相应的命令,这些命令可以从redis官方站点查询。string使用string时,redis**大多数情

imred的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

redis简介(三) redis中的存储数据结构

redis是一种基于key-value的内存数据库。所谓kv存储或者说kv数据库,就是说里面数据都是一对一对的存储的,其中key是唯一的一个索引。这种结构一般是基于哈希表,效率极高,查找复杂度为O(1)。 不过hashmap也不是万能的,随着数据量的增多,造成的hash冲突也就越严重,复杂度增加,redis需要进行rehash,对hashmap进行扩容。如图所示,redis还支持丰富的数据结构类型,那么这些是怎么做到的呢?它们在内存中是怎么存储的呢? 1. redis中的对象 在redis中每

不才的专栏 2297

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis中的数据结构解析

Redis是一个开源的、基于内存的键值存储数据库,支持多种类型的数据结构,如字符串、列表、集合、有序集合等。它以其高性能、持久化选项和易于使用的API而受到开发者的喜爱。Redis通常用于实现快速的数据访问,如缓存、会话存储等。

无远弗届 1319

Redis中的数据结构与对象

介绍了Redis基本数据类型底层的数据结构,同时还介绍了Redis中三种特殊的数据类型

Z..........的博客 829
上一篇: 从零开始构造一台二进制加法器
下一篇: 设计模式(一):代理模式
KKSJS
博客等级 码龄9年 16粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值