Redis之路系列(5)功夫在诗外

news2024/11/17 1:34:51

5 拓展篇—功夫在诗外

6.0新特性

相对都比较鸡肋,谨慎在生产环境使用

ACL安全策略

Redis6版本推出了ACL(Access Control List)访问控制权限 的功能,基于此功能,可以设置多个用户,并且给每个用户单独设 置命令权限和数据权限。

ACL文件配置方式有两种,一种是在config文件中直接配置,另一种是在外部aclfile中配置,配置命令是一样的
ACL是使用DSL定义的,该规则是从上到下,从左到右的,具体可以参考附录中的具体规则说明

RESP3和客户端缓存

RESP(REdisSerializationProtocol),是 Redis服务端与客户端之间通信的协议。
在Reds6之前的版本,使用的是RESP2协议,数据都是以字符串数组的形式返回给客户端,客户端需要根据类型进行解析,增加了客户端实现的复杂度。
RESP3协议可以按类型返回数据。 可以使用HELLO命令在RESP2和RESP3协议之间进行切换

新增的客户端缓存的设计导致客户端缓存和redis缓存绑定,十分不灵活,会导致资源浪费,没有很大的实际使用价值。

Redis中值的变化每次需要同步到客户端缓存,但是客户端并非会用到没的变化,导致资源浪费,数据管理更加复杂了,实际价值不大

I/O多线程

注意:主流程操作还是单线程
开启IO多线程:io-threads-do-reads yes 配置线程数量,如果设为1就是主线程模式:io-threads 4

目前官方建议:至少4核的机器才开启IO多线程,并且除非真的遇到了性能瓶颈,否则不建议开启此配置 。 建议配置的线程数少于机器总线程数,线程并不是越多越好 ,多于8个线程意义不大

集群代理

集群代理把集群抽象成为单个Redis实例,客户端通过集群 代理访问集群,就像访问单个Redis一样,不去关心很多集群上 的问题,比如:集群模式下multiple操作的限制及跨slot操作限 制等等,这些由集群代理去处理。

目前是一个实验性的功能,需要单独安装、单独配置、单独运行,不建议生产环境使用。

Lua脚本

Lua是一个高效、简洁、轻量级、可扩展的脚本语言,可以很方便的嵌入到其它语言或中间件中使用,Redis从2.6版支持Lua。

使用脚本好处
  • 1:减少网络开销
  • 2:原子操作:Redis会把脚本当作一个整体来执行,中间不会插入其它命令
  • 3:复用功能
基本数据类型

Lua是一个动态类型的语言,一个变量可以存储任何类型的值

基础语法
  • 默认全局变量,但是在Redis中不允许使用,局部变量使用local关键字进行声明
  • 变量名必须是非数字开头,只能包含字母、数字和下划线
  • 变量名是区分大小写
  • 逻辑操作符用单词表示:and、or、not
  • 单行注释使用 --来表示,多行注释使用--[[ 开始,到 ]] 结束
  • 支持多重赋值:local a,b = 1,2,3 (a=1,b=2),不过不建议,难维护易错
  • 使用 .. 用来连接字符串
  • 使用 #来获取长度,比如:print(#‘helloworld’)
  • 只有nil和false是假,其它都是真
  • 循环语句有for、while、repeat三种
与Redis结合

在Redis中执行lua脚本命令: redis-cli --eval 脚本 [key...] , [arg...]
在脚本中调用Redis命令:redis.call ,遇到错误会直接返回;想要继续执行使用redis.pcall 命令

Lua数据类型与Redis返回值类型对应关系:

其它命令:

  • evalsha:可以通过脚本摘要来运行,作用同eval
  • script load:将脚本加入缓存,返回值就是SHA1摘要
  • script exists:判断脚本是否已经缓存
  • script flush:清空脚本缓存
  • script kill:强制终止脚本的执行

发布订阅模式

Redis支持简单的发布订阅模式,可以实现进程间的消息传递,对业务要求不高的可以选择使用
下面是一些常用的操作命令:

  • 1:publish:发布消息,格式是publish channel 消息
  • 2:subscribe:订阅频道,格式是subscribe channel,可以是多个channel
  • 3:psubscribe:订阅频道,格式是psubscribe channel,支持glob风格的通配符
  • 4:unsubscribe:取消订阅,格式是unsubscribe channel,不指定频道表示取消所有subscribe命令的订阅
  • 5:punsubscribe:取消订阅,格式是punsubscribe channel,不指定频道表示取消所有psubscribe命令的订阅

注意这里匹配模式的时候,是不会将通配符展 开的,是严格进行字符串匹配的,比如:punsubscribe * 是无法退定 c1.* 的,必须严格使用punsubscribe c1.*才可以

常用优化手段

  • 使用管道Pipeline,有利于减少网络通信和传输
  • 精简键名和键值
  • 合理设计存储的数据结构和数据关系,减少数据冗余
  • 尽量使用mset来赋值,类似还有lpush、zadd等批量操作的命令
  • 如果可能,尽量使用Lua脚本来辅助获取和操作数据
  • 尽量使用hash结构来存储对象
  • 使用hash结构时,应尽量保证每个key下面<field,value>的数目不超过限制(默认值是64)
  • 配置使用类似ziplist以优化list等数据结构
  • 一定要设置maxmemory,保证redis不会因为内存导致崩溃

客户端

Lettuce简介

Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。

Lettuce核心组件有:RedisURI、Connection、RedisClient、RedisCommands

  • RedisURI:封装Redis的连接信息
  • Connection:Redis的连接,包含一些具体方式(单机、哨兵、集群、订阅发布等)
  • RedisClient:Redis的客户端,如果连接集群则为RedisClusterlient
  • RedisCommands:Redis的命令操作API接口,提供了三种调用方式:同步、异步、响应式

基本使用

官网地址:https://lettuce.io/docs/getting-started.html

基本依赖:

dependencies {
  compile 'io.lettuce:lettuce-core:6.1.4.RELEASE
}

基本使用示例:

RedisClient redisClient = RedisClient.create("redis://password@localhost:6379/0");
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();

syncCommands.set("key", "Hello, Redis!");

connection.close();
redisClient.shutdown();

与Spring的集成

@Configurationclass AppConfig { @Beanpublic LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379)); } }

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

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

相关文章

机器学习/算法工程师面试题目与答案-深度学习部分1

机器学习/算法工程师面试题目与答案-深度学习部分 BatchNormalization的作用梯度消失循环神经网络&#xff0c;为什么好?什么是GroupConvolution什么是RNN神经网络中权重共享的是&#xff1f;神经网络激活函数&#xff1f;为什么在深度学习中常进行finetuning画GRU结构图什么是…

python+django校园社交高校交友网站2x7r5.

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 前端&#xff1a;vue.jselementui 框架&#…

探索Web3:去中心化的互联网新时代

引言 在过去的几十年里&#xff0c;互联网已经改变了我们的生活方式、商业模式以及社交互动方式。然而&#xff0c;一个新的技术浪潮——Web3正在崭露头角&#xff0c;预示着一个去中心化的互联网新时代的来临。本文将深入探讨Web3技术的定义、特点以及其对未来互联网发展的影…

跨平台SIP 客户端-linphone下载、使用、开启视频H264

linphone 介绍 Linphone 是一种开源的语音和视频通信应用程序&#xff0c;它提供了基于互联网协议&#xff08;IP&#xff09;的实时通信功能。用于语音/视频通话、即时消息和电话会议的开源 SIP 电话。它适用于移动和桌面环境&#xff08;iOS、Android、GNU/Linux、macOS、Win…

【ensp】网关冗余vrrp实验

基础文字知识复习时&#xff0c;添加&#xff0c;下文仅拓扑以及核心配置以及结果分析 冗余路由器 核心代码&#xff1a; int g0/0/0 [R1-GigabitEthernet0/0/0]vrrp vrid 1 virtual-ip 192.168.10.1 ###设置虚拟ip [R1-GigabitEthernet0/0/0]vrrp vrid 1 priority 120 …

Flutter-自定义画板

效果 功能 支持绘制线、圆、矩形&#xff0c;支持拓展支持撤回上一步支持清空画板支持自定义画笔颜色&#xff0c;宽度 实现 定义绘制类型 /// 类型 enum ShapeType {//线line,//圆circle,//矩形rectangle,//拓展 }定义绘制抽象类 import dart:ui;/// 绘制抽象类 abstract…

云原生Service Mesh服务网格简单介绍

serviceMesh是什么 Service Mesh是一个用于处理服务间通信的基础设施层&#xff0c;旨在实现云原生应用复杂服务拓扑中的可靠请求传递。其基本构成是一组与应用一起部署的轻量级网络代理&#xff0c;这些代理对应用来说是透明的。Service Mesh通过统一的方式来控制和处理服务间…

数据结构-二叉树-链式

一、链式二叉树的结构 typedef int BTNodeDataType; typedef struct BTNode {BTNodeDataType data;struct BTNode* left;struct BTNode* right; }BTNode; 二叉树的前中后序遍历 前序&#xff1a;根左右 中序&#xff1a;左根右 后序&#xff1a;左右根 void PreOrder(BTNo…

大语言模型Ollama

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Ollama简介 Ollama是一个开源的大语言模型平台&#xff0c;它允许用户在本地环境中运行、创建和共享大型语言模型。Ollama提供了丰富的功能和特性&#xff0c;使得用户可以…

Jenkins - macOS 上安装

文章目录 关于 JenkinsmacOS 上安装 Jenkins方式一&#xff1a;brew方式二&#xff1a;tomcat Jenkins war 关于 Jenkins 官网上下载Jenkins并将其安装到持续集成服务器 https://jenkins.io/download/ macOS 上安装 Jenkins 现在本 macOS 上测试 https://www.jenkins.io/do…

更新至2022年上市公司数字化转型数据合集(四份数据合集)

更新至2022年上市公司数字化转型数据合集&#xff08;四份数据合集&#xff09; 一、2000-2022年上市公司数字化转型数据&#xff08;年报词频、文本统计&#xff09; 二、2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据…

Golang基础4-type、go测试

type相关 别名&#xff1a;本质上是更好的理解代码&#xff0c;比如byte(uint8)、rune(int32) 定义新类型&#xff0c;那么就相当于时struct了 package mainimport ("fmt""strconv" )// XInt 别名,在编译的时候会直接替换int type XInt int// YInt 自定…

线性代数基础1向量

1、向量是什么 1.1、向量的定义 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1a;代表向量的…

W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI

未来将会有诸多应用&#xff0c;这些应用将通过菜单进行有序组织和管理。因此&#xff0c;我们需要率先打造好菜单。 LCD 驱动通常是直接写屏的&#xff0c;虽然速度较快&#xff0c;但用于界面制作则不太适宜。所以&#xff0c;最好能拥有一套 UI 框架。如前所述&#xff0c;…

面试二十一、红黑树

性质&#xff1a; 插入&#xff1a; 旋转&#xff1a;

Git之merge与rebase操作命令及问题

背景&#xff1a;之前一直使用的是 merge 来实现两分支的合并代码操作&#xff0c;遇到冲突&#xff0c;解决完冲突从头 add 、commit 、push 再次操作一遍提交操作就没啥事了。但后来的大型项目是 多人协同开发&#xff0c;前端带头人提议倡导使用 rebase 来合并分支&#xff…

【MySQL】libmysqlclient-dev安装失败

报错内容如下&#xff1a; 下列软件包有未满足的依赖关系&#xff1a; libmysqlclient-dev : 依赖: libssl-dev 但是它将不会被安装 依赖: zlib1g-dev 但是它将不会被安装 E: 无法修正错误&#xff0c;因为您要求某些软件包保持现状&#xff0c;就是它们破坏了软件包间的依赖关…

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

flutter ios Firebase 消息通知错误 I-COR000005,I-FCM001000 解决

*前提是已经 使用firebase-tools 已经给 Flutter 加入了 消息通知相关配置。教程>> 一、I-COR000005 10.22.0 - [FirebaseCore][I-COR000005] No app has been configured yet. import Firebase....FirebaseApp.configure() 10.22.0 - [FirebaseMessaging][I-FCM001000…

Golang | Leetcode Golang题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; func rotate(matrix [][]int) {n : len(matrix)// 水平翻转for i : 0; i < n/2; i {matrix[i], matrix[n-1-i] matrix[n-1-i], matrix[i]}// 主对角线翻转for i : 0; i < n; i {for j : 0; j < i; j {matrix[i][j], matrix[j][i]…