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.mfbz.cn/a/463077.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

游戏引擎中网络游戏的基础

一、前言 网络游戏所面临的挑战&#xff1a; 一致性&#xff1a;如何在所有的主机内都保持一样的表现可靠性&#xff1a;网络传输有可能出现丢包安全性&#xff1a;反作弊&#xff0c;反信息泄漏。多样性&#xff1a;不同设备之间链接&#xff0c;比如手机&#xff0c;ipad&a…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…

确保云原生部署中的网络安全

数字环境正在以惊人的速度发展&#xff0c;组织正在迅速采用云原生部署和现代化使用微服务和容器构建的应用程序&#xff08;通常运行在 Kubernetes 等平台上&#xff09;&#xff0c;以推动增长。 无论我们谈论可扩展性、效率还是灵活性&#xff0c;对于努力提供无与伦比的用…

源码|批量执行invokeAll()多选一invokeAny()

ExecutorService中定义了两个批量执行任务的方法&#xff0c;invokeAll()和invokeAny()&#xff0c;在批量执行或多选一的业务场景中非常方便。invokeAll()在所有任务都完成&#xff08;包括成功/被中断/超时&#xff09;后才会返回&#xff0c;invokeAny()在任意一个任务成功&…

校园博客系统 |基于springboot框架+ Mysql+Java的校园博客系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…

电源适配器

电源适配器 1. 选购指南2. 接口测量方法3. 电源接口4. 抗干扰磁环&#xff0c;稳定输出References 1. 选购指南 插头尺度相同&#xff0c;供电电压 (V) 相同&#xff0c;电流 (A) > 原来的电流 (A) INPUT (输入)&#xff0c;OUTPUT (输出) 2. 接口测量方法 3. 电源接口 外…

ARM和AMD介绍

一、介绍 ARM 和 AMD 都是计算机领域中的知名公司&#xff0c;它们在不同方面具有重要的影响和地位。 ARM&#xff08;Advanced RISC Machine&#xff09;&#xff1a;ARM 公司是一家总部位于英国的公司&#xff0c;专注于设计低功耗、高性能的处理器架构。ARM 架构以其精简指…

HCIP—BGP邻居关系建立实验

BGP的邻居称为&#xff1a;IBGP对等体 EBGP对等体 1.EBGP对等体关系&#xff1a; 位于 不同自治系统 的BGP路由器之间的BGP对等体关系 EBGP对等体一般使用 直连建立 对等体关系&#xff0c;EBGP邻居之间的报文 TTL中值设置为1 两台路由器之间建立EBGP对等体关系&#xff0…

Python Web开发记录 Day12:Django part6 用户登录

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡《竹枝词》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、登录界面2、用户名密码校验3、cookie与session配置①cookie与session②配置…

【机器学习-02】矩阵基础运算---numpy操作

在机器学习-01中&#xff0c;我们介绍了关于机器学习的一般建模流程&#xff0c;并且在基本没有数学公式和代码的情况下&#xff0c;简单介绍了关于线性回归的一般实现形式。不过这只是在初学阶段、为了不增加基础概念理解难度所采取的方法&#xff0c;但所有的技术最终都是为了…

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…

C语言之快速排序

目录 一 简介 二 代码实现 快速排序基本原理&#xff1a; C语言实现快速排序的核心函数&#xff1a; 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结&#xff1a; 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法&#xff0c;由英国计算机科学家C.A.R. H…

【Machine Learning】Suitable Learning Rate in Machine Learning

一、The cases of different learning rates: In the gradient descent algorithm model: is the learning rate of the demand, how to determine the learning rate, and what impact does it have if it is too large or too small? We will analyze it through the follow…

HCIP—OSPF课后练习一

本实验模拟了一个企业网络场景&#xff0c;R1、R2、R3为公司总部网络的路由器&#xff0c;R4、R5分别为企业分支机构1和分支机构2的路由器&#xff0c;并且都采用双上行方式与企业总部相连。整个网络都运行OSPF协议&#xff0c;R1、R2、R3之间的链路位于区域0&#xff0c;R4与R…

Redis和Mysql的数据一致性问题

在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求的频率。 但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键了。 1、导…

并查集Disjoint Set

并查集的概念 并查集是一种简单的集合表示&#xff0c;它支持以下三种操作 1. make_set(x)&#xff0c;建立一个新集合&#xff0c;唯一的元素是x 2. find_set(x)&#xff0c;返回一个指针&#xff0c;该指针指向包含x的唯一集合的代表&#xff0c;也就是x的根节点 3. union_…

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

学习shell脚本

文章目录 什么是shell脚本为什么要学习shell脚本第一个脚本编写与执行 简单的shell脚本练习简单案例脚本的执行方式差异(source、sh script、./script) 如何使用shell脚本的判断式利用test命令的测试功能利用判断符号[ ]shell脚本的默认变量($0、$1...) shell脚本的条件判断式利…
最新文章