redis中List和hash数据类型

list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素,一个列表当中可以存储一个或者多个元素,redis的list支持存储2^32-1个元素。redis可以从列表的两端进行插入(pubsh)和弹出(pop)元素,支持读取指定范围的元素集,或者读取指定下标的元素等操作。redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色。

redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。

list类型结构实现主要是依据链表压缩列表

下面是插入了“hello“、”world“、”redis“ 三个元素的链表结构:

压缩列表的构成:

Zlbytes:压缩列表占用的内存字节数

Zltail:压缩列表尾结点距离起始地址有多少个字节

zllen:压缩列表节点数

entryX:压缩列表节数

Zlend:压缩列表末端

压缩列表节点的构成:

Previous_entry_length:压缩列表前一个节点的长度

encoding:当前节点的值的类型与长度

Content:当前节点的值

压缩列表的遍历(表尾遍历到表头):

List应用场景

list类型的brop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。

秒杀抢购:某个商品限制在一个时间段,以低价进行售卖。

问题:

1.超卖

2.高并发

3.恶意请求

list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等。

hash类型基础

redis hash数据结构是一个键值对(key-value)集合,它是一个string类型的field和value的映射表,redis本身就是一个key-value型数据库,因此hash数据结构相当于在value中又套了一层key-value型数据。所以redis中hash数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。

hash类型基于什么实现?

1.压缩列表

2.Hash表

字典又称符号表,关联数组或者映射,是一种用于保存键值对的抽象数据结构。

字典中的每个键都是独一无二的,程序可以在字典中根据键值查找与之关联的值,或者通过键来更新值,删除等。

type属性是一个指向dicType结构的指针,每个dicType用于操作特定类型键值对的函数,redis会为用途不同的字典设置不同的类型特定函数。

privdata属性则保存了需要传给那些类型特定函数的可选参数。

table属性是一个数组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对

size属性记录了哈希表的大小,也是table数组的大小

used属性则记录哈希表目前已有节点(键值对)的数量

sizemask属性的值总是等于size-1(从0开始),这个属性和哈希值一起决定一个键应该被放到table数组的哪个索引上面(索引下标值)。

Hash应用场景

购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。

如果说是使用redis来做我们可以以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素。

热点的关键字段用hash。

常用命令

hmset userinfo name “xx” age 10 sex 1 //hmset 设置

hmget userinfo name //查询名字

hmget userinfo age //查询年龄

hmget uesrinfo sex //查询性别

hset userinfo name “harry” //修改名字为“harry”

hset productinfo name shouji //设置商品信息中名字为手机

hdel productinfo name //删除商品信息中名字

hgetall userinfo //查询用户信息所有字段

hincrby productinfo stock 1 //修改产品信息中个数(hincrby 自增)

hmget productinfo stock //查询商品信息中返回个数

systemctl stop firewalld

hash类型的{key,field,value}的结构与对象的(对象id,属性,值)的结构类似,也可以用来存储对象。

在介绍string类型的应用场景时有所介绍,string+json也是存储对象 的一种方式。

两种存储方式对比表:

string+jsonhash
效率很高
容量
灵活性
序列化简单复杂

cart.php

<?php
$user_id = $_GET["user_id"];
$product_id = $_GET["product_id"];
$number = $_GET["number"];$cartKey = "productCart::".$user_id; # 购物车的key 使用用户id与字符串组成 查询的时候也需要加上用户id
$productFiled = "product::".$product_id;# 购物车的商品 使用商品id与字符串组成 购买下单等操作需要加上商品id/*** @return Redis* 友情提示: php使用redis 需要安装redis扩展 是phg安装redis扩展 不是系统安装redis*/
function RedisConnect()
{$redis = new Redis();$redis->connect("127.0.0.1",6379);return $redis;
}$redis = RedisConnect();if ($number == null or $number == 0){$number = 1;
}$redis->hIncrBy($cartKey,$productFiled,$number);echo "加入购物车成功";

index.php

<?php
//echo "Hello World !";
//秒杀功能-处理方案
//1. 前端
//1.1 随机拒绝算法 => 用户点击抢购按钮之后,随机0 1 1通过 0不通过
//1.2 根据用户的id => 双数和单数之分 => 双数抢 单数直接拒绝 10 100
//总共 10 万人
//双数 10000
//单数 90000
//2. nginx
//2.1 nginx+redis+lua 进行算法限流 1 秒 1000个 => 中间在写个随机拒绝的算法
//
//3. php
//redis => 将抢购信息写入到list数据中
//库存的更新先不更新mysql => 先更新redis中的库存
//
//4. 应对黑白名单
//使用nginx+Lua+redis 做黑白名单 抢购必须进行实名+实名之后在绑定手机
//
//redis做秒杀
//1. 削峰限流
//2. 使用简单
//3. 高并发
//
//消息队列还有其他 rabbitmq kafak redis的stream类型等//name => { filed1 => value,
//          filed2 => value,
//          filed3 => value }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全类书籍-3】XSS跨站脚剖析与防御

目录 内容简介 作用 下载地址 内容简介 这本书涵盖以下几点: XSS攻击原理:解释XSS是如何利用Web应用未能有效过滤用户输入的缺陷,将恶意脚本注入到网页中,当其他用户访问时被执行,实现攻击者的目的,例如窃取用户会话凭证、实施钓鱼攻击等。 XSS分类:分为存储型XSS(…

网页中 link 和@import介绍

网页中 link 和import介绍 网页中&#xff0c;link和import都是用来引入外部样式表——CSS&#xff08;层叠样式表&#xff09;文件的方法&#xff0c;它们可以让我们将样式表分离出来&#xff0c;提高代码的可维护性和复用性。 在HTML中&#xff0c;用于引入外部样式表的主要…

【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 文章目录 该系列目录设计目标设计思路RTL及Testbench代码RTL代码Testbench代码 仿真结果上板视频 该系列目录 Verilog线性序列机点灯案例(一)&#xff…

c语言:汽车时代

汽车时代 任务描述 据说看车牌可以知道车辆归属地点&#xff0c;已知黑龙江省车牌归属地的基本规则是&#xff1a; 黑A: 哈尔滨 黑B: 齐齐哈尔 黑C: 牡丹江 黑D: 佳木斯 黑E: 大庆 黑F: 伊春 黑G: 鸡西 黑H: 鹤岗 黑J: 双鸭山 黑K: 七台河 黑L: 松花江地区 黑M: 绥化 黑N: 黑…

快速掌握Adroid基础(入门)

开发环境搭建 学习Android Studio的安装和配置 学习如何安装和配置Android Studio是进入Android开发世界的第一步。以下是一个简明的指南来帮助你开始。 1. 下载Android Studio 访问官方网站 Android Studio 下载最新版本的Android Studio。网站会自动检测你的操作系统并推…

外卖点餐系统 |基于springboot框架+ Mysql+Java+JSP技术+Tomcat的外卖点餐系统 设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 骑手功能模块 商家功能模块 管理员功能登录前台功能效果图 用户功能模块 系统功能设…

获取扇区航班数

1、Spark Streaming清洗服务&#xff0c;接收kafka中Topic为“task_ATC”中的数据&#xff0c;保存在MySQL中。 打开SpringBoot项目BigData-Etl-KongGuan 请认真阅读&#xff1a;在前面的“使用Spark清洗统计业务数据并保存到数据库中”任务阶段中应该已经完成了所有Topic的数…

邻接表存储带权的无向图(c++题解)

题目描述 给出一个无向带权图&#xff0c;顶点数为n&#xff0c;边数为m。 输入格式 第一行两个整数n&#xff0c;m&#xff0c; 接下来有m行&#xff0c;每行3个整数u,v,w,表示点u到点v有一条边,边权为w。 输出格式 第i行输出第点i的所有邻接点&#xff0c;按照点i到该点…

web学习笔记(三十四)

目录 1.面向对象的特征 2.面向对象的继承方式 3.正则表达式 3.1如何创建正则表达式 3.2边界符 3.2[ ]方括号 3.3正则表达式中相关的方法汇总 1.面向对象的特征 封装性&#xff1a;就像是把东西放在一个密封的盒子里一样&#xff0c;只让外部使用者通过指定的接口来访…

python入门(二)

python的安装很方便&#xff0c;我们这里就不再进行讲解&#xff0c;大家可以自己去搜索视频。下面分享一下Python的入门知识点。 执行命令的方式 在安装好python后&#xff0c;有两种方式可以执行命令&#xff1a; 命令行程序文件&#xff0c;后缀名为.py 对于命令行&…

Github 2024-03-16 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目2TypeScript项目1C++项目1Lua项目1Swift项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:4…

Linux服务器(Debian系)包含UOS安全相关巡检shell脚本

#!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format output_file"server_security_inspection_report_${current_date}.txt"# Empty the file initially echo > $output_file# 获取巡检时间 (…

MVCC(多版本并发控制)原理实现

MVCC&#xff08;多版本并发控制&#xff09;原理实现 一、实现组件二、数据可见性判断三、可见性描述 多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;&#xff0c;是一种并发控制的方法。 MySQL InnoDB巧妙地利用了隐藏列、事务ID…

暴雨高性能分布式存储为AI提供坚实数据存力

随着两会的圆满落幕&#xff0c;新质生产力和人工智能的发展成为社会各界热议的焦点。总理在两会后的首次调研中&#xff0c;特别强调了新质生产力和人工智能的重要性&#xff0c;这无疑为人工智能产业的蓬勃发展注入了新的动力。 年初&#xff0c;Sora所引领的人工智能热潮更…

Selenium WebDriver提供By.CSS_SELECTOR定位元素方法

By.CSS_SELECTOR 是 Selenium WebDriver 提供的一种定位元素的方法&#xff0c;它允许使用 CSS 选择器来定位页面上的元素。以下是常见的 CSS 选择器语法&#xff1a; 1. **标签选择器&#xff08;Tag Selector&#xff09;**&#xff1a;通过元素的标签名选择元素。 - 示例…

【入门】保研/考研408机试-基本知识点(输入/出、基本数学、字符串)

目录 一、基础结构方面 1.1调用标准库* 1.2输入输出方面 1.2.1保留几位小数输出* 1.2.2字符/字符串* 1.2.3输入n个数&#xff08;循环用&#xff09; 1.3i和i 二、数学方面 2.1绝对值 2.2幂次方 2.3取整问题 2.4涉及分数计算 三、字符串方面 3.1字符比较 例题&…

Linux中的音频开发

在Linux环境下进行音频开发&#xff0c;你可能会面临多种挑战和任务&#xff0c;从基础的音频播放和录制到复杂的音频处理和流媒体传输。以下是一些音频开发课题和建议&#xff1a; ### 题目1&#xff1a;基础音频播放 **描述**&#xff1a;开发一个简单的命令行应用程序&…

矩阵消元-MIT

文章目录 1. 行变换消元法 1. 行变换消元法 假设我们有一个方程组表示如下&#xff1a; x 2 y z 2 ; 3 x 8 y z 12 ; 4 y z 2 (1) x2yz2;\quad 3x8yz12;\quad4yz2\tag{1} x2yz2;3x8yz12;4yz2(1)矩阵表示如下&#xff1a; [ 1 2 1 3 8 1 0 4 1 ] → [ 1 2 1 0 2 − 2…

【分布式websocket 】前端vuex管理客户端消息crud!使用localStorage来存储【第19期】

前言 聊天系统客户端是要存储消息的&#xff0c;因为所有所有的历史消息都从服务器拉的话一方面服务器压力大&#xff0c;另一方面也耗费用户流量。所以客户端存储消息是势在必行的。如何存储呢上一篇文章也写了&#xff0c;大概就是浏览器的话是localStorage或者IndexedDB。然…

MIT线性代数-方程组的几何解释

文章目录 1. 二维空间1.1 行方向1.2 列方向 2. 三维空间2.1 行方向2.2 列方向 假设有一个方程组 A X B AXB AXB表示如下 2 x − y 0 (1) 2x-y0\tag{1} 2x−y0(1) − x 2 y 3 (2) -x2y3\tag{2} −x2y3(2) 矩阵表示如下&#xff1a; [ 2 − 1 − 1 2 ] [ x y ] [ 0 3 ] (3)…