Redis入门02-基础概念

news2024/12/1 0:44:17

目录

常用的简单操作命令

Redis字符串中的SDS

Redis事务

Key的过期时间

Redis实现缓存简单示例


常用的简单操作命令

Redis提供了多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。以下是每种数据类型的常用基本操作命令示例:

1. 字符串(String)

  • SET key value:设置键值对。

  • GET key:获取键的值。

  • INCR key:递增键的值。

  • DECR key:递减键的值。

2. 哈希(Hash)

  • HSET key field value:设置哈希字段的值。

  • HGET key field:获取哈希字段的值。

  • HDEL key field [field...]:删除一个或多个哈希字段。

  • HGETALL key:获取哈希中的所有字段和值。

3. 列表(List)

  • LPUSH key value [value...]:从左侧插入一个或多个元素。

  • RPUSH key value [value...]:从右侧插入一个或多个元素。

  • LPOP key:从左侧弹出一个元素。

  • RPOP key:从右侧弹出一个元素。

  • LRANGE key start stop:获取列表中指定范围的元素。

4. 集合(Set)

  • SADD key member [member...]:向集合中添加一个或多个成员。

  • SREM key member [member...]:从集合中移除一个或多个成员。

  • SMEMBERS key:获取集合中的所有成员。

  • SISMEMBER key member:检查成员是否存在于集合中。

5. 有序集合(Sorted Set)

  • ZADD key score member [score member...]:向有序集合中添加一个或多个成员,带有分数。

  • ZREM key member [member...]:从有序集合中移除一个或多个成员。

  • ZRANGE key start stop [WITHSCORES]:按分数范围获取成员。

  • ZSCORE key member:获取成员的分数。

这些命令只是每种数据类型的基本操作的示例,Redis提供了丰富的命令集,允许更多复杂的操作和应用程序构建。根据您的具体需求,可以使用适当的命令来操作和管理Redis中的数据。

Redis字符串中的SDS

Redis使用SDS(Simple Dynamic String)实现字符串对象的存储是出于性能和灵活性方面的考虑。以下是一些原因:

  1. 动态长度SDS 允许字符串对象的长度动态变化,而不需要预先分配固定的内存空间。这使得在插入、追加、截断字符串时,Redis可以更有效地管理内存。

  2. 二进制安全SDS 对待字符串为二进制数据,它不仅可以存储文本字符串,还可以存储任何二进制数据,如图像、音频等。这使得 Redis 更灵活,不仅仅用于字符串,还可以处理其他数据类型。

  3. 高效的字符串操作SDS 提供了一系列高效的字符串操作,如追加、删除、截断等,这些操作在不需要重新分配内存的情况下执行。这减少了内存分配和复制的开销,提高了性能。

  4. 减少内存分配开销SDS 内部维护了字符串的长度和可用空间,这减少了重新分配内存的频率。这对于避免内存碎片和减少内存分配的开销非常有利。

  5. C语言兼容性SDS 结构与C语言字符串的结构非常相似,这使得 Redis 可以更容易与C语言库和函数进行集成。

总之,SDS 提供了一种高性能、灵活和高效的方式来处理字符串数据,使 Redis 更适合处理各种不同类型的数据,而不仅仅是文本字符串。这对于Redis作为高性能缓存和数据存储系统非常有用。

Redis事务

Redis中的事务是通过 MULTI、EXEC、DISCARD 和 WATCH 命令来执行的。以下是这些命令的基本操作示例:

  1. MULTI:开始一个事务。这个命令表示开始一个事务块,之后执行的命令将被添加到事务队列,而不会立即执行

  2. 执行事务块(EXEC):执行事务队列中的所有命令。

    这个命令表示执行之前添加到事务队列中的所有命令。如果事务执行成功,将返回一个包含所有命令执行结果的数组。如果事务中的任何命令执行失败,将返回一个空数组。

    MULTI # 开启事务
    ... # 操作指令
    EXEC # 执行事务
  3. 放弃事务(DISCARD):取消当前事务。

    DISCARD

    这个命令表示取消当前事务,清空事务队列中的所有命令,不执行事务中的任何命令。

  4. 监视键(WATCH):监视一个或多个键,以在事务执行期间检测键是否被修改。

    WATCH key [key...]

    这个命令表示监视指定的一个或多个键。如果在执行 EXEC 命令之前,任何被监视的键被其他客户端修改,事务将失败。

下面是一个简单的事务操作示例:

MULTI
SET key1 "value1"
GET key2
INCR key3
EXEC

在这个示例中,我们首先使用 MULTI 命令开启事务,然后将多个命令添加到事务队列中(SET、GET、INCR),最后使用 EXEC 命令来执行事务。如果所有命令成功执行,EXEC 将返回每个命令的结果;如果其中任何一个命令失败,事务将被取消,EXEC 将返回一个空数组。

Redis事务允许将多个命令打包成一个原子操作,这对于需要保持数据一致性的应用程序非常有用。请注意,Redis的事务不支持回滚,如果事务失败,您需要自己处理数据回滚的逻辑。此外,WATCH 命令用于乐观锁的实现,以确保在事务执行期间,监视的键没有被其他客户端修改。

Key的过期时间

过期时间的机制主要是针对具有时效性的key,是一个非常有用的功能,它允许你在一段时间后自动删除键,从而有效地管理内存和数据的生命周期。

对于实现缓存、会话管理和数据自动清理等场景非常有用。使用它可以避免不再需要的数据长时间占用内存,从而提高Redis数据库的性能和可用性。

关于过期时间的常用技巧:

  1. 设置过期时间:你可以使用 EXPIREPEXPIRE 命令来为一个键设置过期时间。EXPIRE 使用以秒为单位的过期时间,而 PEXPIRE 使用以毫秒为单位的过期时间。例如:

    shellCopy codeEXPIRE key 3600  # 设置键 key 在 3600 秒后过期
    PEXPIRE key 60000  # 设置键 key 在 60000 毫秒后过期
  2. 查看剩余过期时间:你可以使用 TTLPTTL 命令来查看键的剩余过期时间,以秒或毫秒为单位。如果键已过期或不存在,这些命令将返回-1。例如:

    shellCopy codeTTL key  # 返回键 key 的剩余过期时间(秒)
    PTTL key  # 返回键 key 的剩余过期时间(毫秒)
  3. 移除过期时间:你可以使用 PERSIST 命令来移除键的过期时间,从而使键永不过期。例如:

    shellCopy code
    PERSIST key  # 移除键 key 的过期时间
  4. 判断键是否已过期:你可以使用 KEYSSCAN 命令来查找已过期的键,然后将其删除。请谨慎使用 KEYS,因为它可能会导致性能问题,特别是在大型数据库中。

  5. 自动删除:Redis会自动处理过期键的删除。当你尝试访问一个已经过期的键时,Redis将返回一个空值。过期键的自动删除是异步的,因此实际删除时间可能略有延迟。

  6. 过期策略:Redis使用定期删除和惰性删除两种策略来管理过期键。定期删除会周期性地检查并删除过期键,而惰性删除是在键被访问时检查并删除过期键。

Redis实现缓存简单示例

在Java中使用Redis实现缓存是一种常见的做法,可以提高应用程序的性能。以下是一个简单的示例,演示如何使用Java和Redis来实现缓存。需要在Java项目中引入Redis客户端库,如Jedis或Lettuce,以便连接和与Redis服务器进行交互。

  1. 连接到Redis服务器,然后使用setex方法将用户数据存储到Redis中,并为键设置过期时间。

  2. 尝试从缓存中获取数据,如果数据存在,就使用缓存数据;如果缓存中没有数据,它会从数据源获取数据,然后将数据存入缓存。

import redis.clients.jedis.Jedis;
​
public class RedisCacheExample {
    public static void main(String[] args) {
        // 创建一个Jedis客户端实例,连接到Redis服务器
        Jedis jedis = new Jedis("localhost", 6379);
​
        // 设置缓存数据
        String key = "user:123"; // 假设存储用户数据的缓存键
        String userData = "{'id': 123, 'name': 'John'}"; // 用户数据的 JSON 字符串
        int cacheTimeout = 60; // 缓存超时时间(以秒为单位)
​
        // 将用户数据存储到Redis中,设置过期时间
        jedis.setex(key, cacheTimeout, userData);
​
        // 从缓存中获取数据
        String cachedData = jedis.get(key);
        if (cachedData != null) {
            System.out.println("Data from cache: " + cachedData);
        } else {
            // 如果缓存中没有数据,从数据源获取数据并存入缓存
            String dataFromDataSource = fetchDataFromDataSource();
            jedis.setex(key, cacheTimeout, dataFromDataSource);
            System.out.println("Data from data source: " + dataFromDataSource);
        }
​
        // 关闭Jedis客户端连接
        jedis.close();
    }
​
    // 模拟从数据源获取数据的方法
    private static String fetchDataFromDataSource() {
        // 这里可以模拟从数据库或其他数据源中获取数据
        return "{'id': 123, 'name': 'John'}";
    }
}

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

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

相关文章

Spring系列之基础

目录 Spring概述 Spring的优点 Spring Framework的组成 总结 Spring概述 Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。它以Ioc(控制反转)和…

GAMP源码阅读:RINEX文件读取

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 1、readobsnav():Rinex 文件读取主入口函数2、readrnxfile():传入文件路径,读取起止时间内数据4、readrnxfp()…

“原生感”暴涨311%,这届年轻人不再爱浓妆?丨小红书数据分析

近年来,越来越多美妆博主在社交媒体平台安利“原生感妆容”,即我们所熟知的“伪素颜妆”、“裸妆”、“白开水妆”,显然,追求“原生感”成为当代妆容主流。通过小红书数据分析工具,查看#原生感妆容 话题,近…

一位69岁美国老程序员的自述:使用Delphi开发了一款软件仅仅销售了半年赚够钱就退休了

我不确定谁会感兴趣,但你是点击按钮的那个人......所以我就说了。 我是一名 69 岁(截至 2008 年)的退休程序员(译者注:Delphi社区的一位网友说本文主人公已经在前几年去世,但是主人公的网站依然还能访问Del…

Mojo::UserAgent模块做的一个快速爬虫项目

use Mojo::UserAgent;my $ua Mojo::UserAgent->new; my $proxy duoip:8000;# 使用爬虫IP $ua->proxy(http, $proxy) # 设置http爬虫IP->proxy(https, $proxy); # 设置https爬虫IPmy $res $ua->get(音乐网址); if ($res->is_success) {print $res->body; …

让企业的数据用起来,数据中台=数据治理?

加gzh“大数据食铁兽”,了解更多数据治理信息。 先说结论:数据中台是数据管理/治理的工具之一,数据治理是3分技术7分管理及运营。 数据中台的定义: 狭义的数据中台指在企业内部通过对数据半成品、算法、模型、工具等能力的积累&a…

apk反编译修改教程系列---简单去除apk联网权限 其他权限 无法自动更新等【四】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 目前基本所有的apk都有联网设…

蚂蚁蚁盾发布实体产业「知识交互建模引擎」,最快10分钟定制AI风控模型

数字化起步晚、数据分散稀疏、专业壁垒高、行业知识依赖「老师傅」,是很多传统产业智能化发展面临的难题。2023年云栖大会上,蚂蚁集团安全科技品牌蚁盾发布“知识交互建模引擎”,将实体产业知识与AI模型有机结合,助力企业最快10分…

【C++】类的默认成员函数----const成员函数(超详细解析)

目录 一、前言 二、const成员函数 🍎const修饰类的成员函数 💦问题1 💦问题2 💦针对const成员函数的常考面试题(重点!!) 🍐取地址及const取地址操作符重载 三…

可靠的互联网兼职平台,平常可以做副业充实生活

在互联网时代,越来越多的人开始通过网络来寻找兼职副业的机会,能够更灵活地安排自己的时间,实现自己的收入增值。那么找到一个正规可靠的线上兼职平台就是一个比较重要的事情,这里分享几个正规靠谱的线上兼职副业平台,…

生物信息学 | 借助 AI 更高效地开启研究

生物信息学 (Bioinformatics) 是指利用应用数学、信息学、统计学和计算机科学的方法,研究生物学问题。 随着计算机科学技术的发展,AI 在解决复杂又颇具挑战的生物学研究问题方面,显露出极大的优势,进一步加速了传统研究范式的转变…

京东h5st逆向 h5st代码之拓展

知识点 node安装模块 crypto-js JavaScript 中的加密库 则更偏向于消息摘要算法、对称加密和简单的哈希函数,支持 AES、DES、SHA-1、HMAC 等诸多算法,适用于对客户端本地存储的数据进行加密、散列或签名处理等场景 axios 一旦安装成功,我们就…

uniapp原生插件之视频图片选择安卓原生插件

插件介绍 本地相册图片和视频多选Android扩展原生插件 插件地址 视频图片选择安卓原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件申请权限 存储卡读写权限 manifest.json权限列表 /* android打包配置 */"android" : {"permission…

python和java区别

1.java需要javac编译为.class文件,用java运行,定义的类需要与文件名相同;python能直接运行;不过,现在java的jdk中能直接使用java直接运行.java文件了! 2. java声明变量数据类型,使用int a 8&am…

k8s调度约束

List-Watch Kubernetes 是通过 List-Watch的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 List-Watch机制 工作机制:用户通过 kubectl请求给 APIServer 来建立一个 Pod。APIServer会将Pod相关元信息存入 etcd 中…

Jetson NX FFmpeg硬件编解码实现

最近在用Jetson Xavier NX板子做视频处理,但是CPU进行视频编解码,效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看,发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改,因此需要编译两份源码 1.1、编译jetson-ffmpeg …

Polygon MidenVM中的recursive STARK verification优化

1. 引言 本文主要参考Bobbin Threadbare 2023年9月在ZK Summit 10上的分享 ZK10: Optimizing recursive STARK verification in Polygon Miden VM - Bobbin Threadbare。 本文基本内容框架为: STARK递归方法Miden需求及目标递归verifier开销Miden VM优化措施结果…

YOLOv7优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研…

JS加密/解密之XX数据后台列表JS加密

目标地址 ZHkuZmVpZ3VhLmNu 需求 老朋友联系到我,希望能自己做一个方便读取的小工具给公司内部用,承诺绝不外传。但是获取接口数据的最后一步遇到了问题,响应回来的数据做了大量加密,无法识别。 代码分析 该站代码做了大量的…

MS-VS C# 简单开发记录(GUI)1 -从一个菜单点击打开新窗口

前言: C# 的使用,似乎在机器视觉的集成项目里面变得越来越多了,笔者无奈的熟悉起来这个环境,不过,据说,如果做界面的设计,C#的使用是异常方便的,有的不行了,做几个实例看…