redis

server/2024/9/24 7:17:50/

reids

  • 基本
    • 概念
    • 特性
  • 安装
  • 命令
  • lua 脚本
    • EVALSHA命令
    • 例子
    • lua脚本摘要
      • 参考

基本

概念

redis: REmote DIctionary Server
key-value 存储系统,非关系型数据库
开源的使用 ANSI C 语言编写
支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

值(value)可以是
字符串(String)
哈希(Hash)
列表(list)
集合(sets)
有序集合(sorted sets)

特性

性能极高
Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作
高性能的读写能力:Redis 能读的速度是 110000次/s,写的速度是 81000次/s。这种高性能主要得益于 Redis 将数据存储在内存中,从而显著提高了数据的访问速度。

原子性操作
Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
支持发布/订阅模式:Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。

单线程模型:尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。

安装

sudo apt install redis-server
起 server
redis-server
另一窗口
起redis-cli,输入ping 回复PONG

命令

获取所有key keys *
清空当前数据库 flushdb

lua 脚本

Redis在服务器中嵌入了Lua环境

为什么使用:
减少网络开销: 使用脚本功能完成同样的操作只需要发送一个请求即可,减少了网络往返时延。

在这里插入图片描述
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] …

–eval,告诉redis-cli读取并运行后面的lua脚本

path/to/redis.lua,是lua脚本的位置

KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取

ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。
注意:KEYS和ARGV中间的 ‘,’ 两边的空格,不能省略。

在这里插入图片描述

EVALSHA命令

eval sha1id numkeys key [key …] arg [arg …]

在脚本比较长的情况下,如果每次调用脚本都需要将整个脚本传给Redis会占用较多的带宽。

为了解决这个问题,Redis提供了EVALSHA命令,允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法和EVAL一样,只不过是将脚本内容替换成脚本内容的SHA1摘要。

Redis在执行EVAL命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行EVALSHA命令时Redis会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:“NOSCRIPT No matching script. Please use EVAL.”

在程序中使用EVALSHA命令的一般流程如下。

1)先计算脚本的SHA1摘要,并使用EVALSHA命令执行脚本。

2)获得返回值,如果返回“NOSCRIPT”错误则使用EVAL命令重新执行脚本。

虽然这一流程略显麻烦,但值得庆幸的是很多编程语言的Redis客户端都会代替开发者完成这一流程。执行EVAL命令时,先尝试执行EVALSHA命令,如果失败了才会执行EVAL命令。

SCRIPTLOAD “lua-script” 将脚本加入缓存,但不执行, 返回:脚本的SHA1摘要
SCRIPT EXISTS lua-script-sha1 判断脚本是否已被缓存

例子

开始的数据库
在这里插入图片描述
lua脚本

local name=redis.call("get",KEYS[1])
local age=redis.call("get",KEYS[2])
if name=="lilei" thenredis.call("set",KEYS[1],ARGV[1])redis.call("incr",KEYS[2])
elseredis.call("set", "111", "222")
end

执行
redis-cli --eval ./01.lua name age , aaa
执行后
在这里插入图片描述

lua脚本摘要

一个Lua脚本很长的话,那么直接这么调用Lua脚本的话非常不方便,所以Redis当中提供了一个命令script load来为手动给每一个命令生成摘要,这里之所以要说手动的原因是即使我们不使用这个命令,每次调用完Lua脚本的时候,Redis也会为每个Lua脚本生成一个摘要。

例子

127.0.0.1:6379> script load "return redis.call('set', KEYS[1], ARGV[1])"
"55b22c0d0cedf3866879ce7c854970626dcef0c3"
127.0.0.1:6379> evalsha "55b22c0d0cedf3866879ce7c854970626dcef0c3" 1 name abc
OK
127.0.0.1:6379> get name
"abc"

script exists 摘要:判断一个摘要是否存在。0表示不存在,1表示存在
script flush:清除所有Lua脚本缓存

例子
当我们的Lua脚本很长时,直接在命令窗口中写脚本是不直观的,也很难发现语法问题,所以Redis当中也支持我们直接把先把脚本写入文件中,然后直接调用文件。
比如我们新建一个test.lua脚本:

redis.call('set',KEYS[1],ARGV[1])
return redis.call('get',KEYS[1])

参考

https://www.runoob.com/redis/redis-tutorial.html
redis使用lua脚本 https://www.cnblogs.com/aspirant/p/16772759.html
Redis 如何调试Lua 脚本 https://zhuanlan.zhihu.com/p/353860023


http://www.ppmy.cn/server/29642.html

相关文章

c# winform快速建websocket服务器源码 wpf快速搭建websocket服务 c#简单建立websocket服务 websocket快速搭建

完整源码下载----->点击 随着互联网技术的飞速发展,实时交互和数据推送已成为众多应用的核心需求。传统的HTTP协议,基于请求-响应模型,无法满足现代Web应用对低延迟、双向通信的高标准要求。在此背景下,WebSocket协议应运而生…

使用 ORPO 微调 Llama 3

原文地址:https://towardsdatascience.com/fine-tune-llama-3-with-orpo-56cfab2f9ada 更便宜、更快的统一微调技术 2024 年 4 月 19 日 ORPO 是一种新的令人兴奋的微调技术,它将传统的监督微调和偏好校准阶段合并为一个过程。这减少了训练所需的计算…

Github2024-05-02开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目4Rust项目2Vue项目1GDScript项目1SystemVerilog项目1Python项目1非开发语言项目1精心策划的编码面试准备材料 创建周期:2764 天…

uni-app scroll-view隐藏滚动条的小细节 兼容主流浏览器

开端 想写个横向滚动的列表适配浏览器,主要就是隐藏一下滚动条在手机上美观一点。 但是使用uni-app官方文档建议的::-webkit-scrollbar在目标标签时发现没生效。 .scroll-view_H::-webkit-scrollbar{display: none; }解决 F12看了一下,原来编译到浏览…

微软开源 MS-DOS「GitHub 热点速览」

上周又是被「大模型」霸榜的一周,各种 AI、LLM、ChatGPT、Sora、RAG 的开源项目在 GitHub 上“争相斗艳”。这不 Meta 刚开源 Llama 3 没几天,苹果紧跟着就开源了手机端大模型:CoreNet。 GitHub 地址:github.com/apple/corenet 开…

(51单片机)第十三章-STC系列51单片机功能介绍

13.1 单片机空闲与掉电模式的应用 1. 空闲模式 当单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。假若定时器正在运行,…

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…

【大模型应用】使用 Windows 窗体作为 Copilot 应用程序的 Ollama AI 前端(测试llava视觉问答)...

项目 “WinForm_Ollama_Copilot” 是一个使用Windows Forms作为前端的Ollama AI Copilot应用程序。这个项目的目的是提供一个用户界面(UI),通过它,用户可以与Ollama AI进行交互。以下是该项目的一些关键特点和功能: Ollama Copilot: 这是一个…