Redis运行原理及基本数据类型

        Redis 是一个开源的、基于内存的数据存储系统,它通过键值对的方式存储数据。是单线程的内存数据库,采用事件驱动模型来处理并发请求。它使用非阻塞的 I/O 多路复用机制来实现高性能的并发访问。数据库通常会将数据存储在内存中,这样可以提高数据读写的速度。此外,Redis 也支持将数据持久化到磁盘上,以防止数据丢失。采用基于内存的数据结构以及高效的数据存储和检索算法,从而提供快速的数据访问速度。

Redis 的运行原理主要包括以下几个方面:

  1. 单线程模型: Redis 是单线程的,即通过一个事件循环来处理所有的客户端请求。这意味着 Redis 在任意时刻只能处理一个请求,不需要考虑多线程并发访问的同步和竞争条件,简化了系统设计和开发。

  2. 事件驱动模型: Redis 使用事件驱动模型来管理客户端请求和网络 I/O。它采用非阻塞 I/O 多路复用技术,如 epoll(Linux)、kqueue(BSD)、select 等,实现在单线程中同时处理多个连接的读写操作,提高系统的并发性能。

  3. 内存数据库: Redis 数据通常存储在内存中,这样可以加快数据的读写速度。为了防止数据丢失,Redis 提供了持久化机制,可以将数据定期保存到磁盘上,保证数据的持久性。

  4. 数据结构和算法: Redis 使用高效的数据结构和算法来支持各种数据类型的存储和操作,如哈希表、跳表等。这些数据结构和算法使得 Redis 能够在内存中快速存储和检索数据,并提供高效的数据操作命令。

  5. 主从复制和集群架构: Redis 支持主从复制和集群架构,可以实现数据的备份和负载均衡。主从复制通过将主节点的数据复制到从节点,实现数据的备份和故障恢复;集群架构则可以横向扩展 Redis 集群的性能和容量。

        总的来说,Redis 的运行原理基于单线程、事件驱动的模型,利用内存数据库和高效的数据结构算法来提供快速的数据存储和处理能力。通过持久化机制、主从复制和集群架构等特性,Redis 实现了高性能、高可用性和可伸缩性,成为广泛应用于缓存、会话存储、消息队列等场景的流行数据库解决方案。

Redis 中每种基本数据类型的使用方法及作用:

  1. 字符串(String):

    • 使用方法:通过 SET 命令设置字符串值,GET 命令获取字符串值。
    • 作用:存储文本、整数或二进制数据,常用于缓存、计数器等场景。
  2. 哈希表(Hash):

    • 使用方法:HSET 设置哈希表字段值,HGET 获取哈希表字段值,HGETALL 获取所有字段和值。
    • 作用:类似于关联数组,适合存储对象属性,如用户信息、商品信息等。
  3. 列表(List):

    • 使用方法:LPUSH 在列表左侧插入元素,RPUSH 在列表右侧插入元素,LPOP 弹出左侧元素,RPOP 弹出右侧元素。
    • 作用:按照插入顺序存储元素,可用于实现队列、栈等数据结构。
  4. 集合(Set):

    • 使用方法:SADD 向集合添加元素,SMEMBERS 获取集合所有元素,SINTER 计算多个集合的交集。
    • 作用:存储唯一且无序的元素集合,可用于去重、标签系统等。
  5. 有序集合(Sorted Set):

    • 使用方法:ZADD 向有序集合添加元素,ZRANGE 根据分数范围获取元素,ZREM 移除元素。
    • 作用:类似于集合,但每个元素会有一个分数关联,可根据分数排序元素,适合排行榜、权重数据存储等场景。

Redis 五种常见数据类型在 Java 中使用的示例代码:

(下面还有Java Spring Boot示例代码,需要的请往下翻)

字符串(String):
import redis.clients.jedis.Jedis;public class RedisStringExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 设置字符串值jedis.set("key1", "value1");// 获取字符串值String value = jedis.get("key1");System.out.println(value);jedis.close();}
}
哈希表(Hash):
import redis.clients.jedis.Jedis;
import java.util.Map;public class RedisHashExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 设置哈希表字段值jedis.hset("user:1", "name", "Alice");jedis.hset("user:1", "age", "25");// 获取哈希表字段值Map<String, String> user = jedis.hgetAll("user:1");System.out.println(user);jedis.close();}
}
列表(List):
import redis.clients.jedis.Jedis;
import java.util.List;public class RedisListExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 左侧插入元素jedis.lpush("list1", "element1");jedis.lpush("list1", "element2");// 获取列表元素List<String> list = jedis.lrange("list1", 0, -1);System.out.println(list);jedis.close();}
}
集合(Set):
import redis.clients.jedis.Jedis;
import java.util.Set;public class RedisSetExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 向集合添加元素jedis.sadd("set1", "member1");jedis.sadd("set1", "member2");// 获取集合所有元素Set<String> set = jedis.smembers("set1");System.out.println(set);jedis.close();}
}
有序集合(Sorted Set):
import redis.clients.jedis.Jedis;
import java.util.Set;public class RedisSortedSetExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 向有序集合添加元素jedis.zadd("sortedset1", 1.0, "member1");jedis.zadd("sortedset1", 2.0, "member2");// 根据分数范围获取元素Set<String> set = jedis.zrangeByScore("sortedset1", 0, 2);System.out.println(set);jedis.close();}
}

Redis 五种常见数据类型在 Java Spring Boot 中使用的示例代码:

字符串(String):
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class StringController {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@PostMapping("/setString")public void setString(@RequestParam String key, @RequestParam String value) {// 使用 StringRedisTemplate 操作字符串类型数据stringRedisTemplate.opsForValue().set(key, value);}@GetMapping("/getString")public String getString(@RequestParam String key) {// 使用 StringRedisTemplate 获取字符串类型数据return stringRedisTemplate.opsForValue().get(key);}
}
哈希表(Hash):
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class HashController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/setHash")public void setHash(@RequestParam String key, @RequestParam String field, @RequestParam String value) {// 使用 RedisTemplate 操作哈希表类型数据HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();hashOps.put(key, field, value);}@GetMapping("/getHash")public String getHash(@RequestParam String key, @RequestParam String field) {// 使用 RedisTemplate 获取哈希表类型数据HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();return hashOps.get(key, field);}
}
列表(List):
import org.springframework.data.redis.core.ListOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class ListController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/pushToList")public void pushToList(@RequestParam String key, @RequestParam String value) {// 使用 RedisTemplate 操作列表类型数据ListOperations<String, String> listOps = redisTemplate.opsForList();listOps.leftPush(key, value);}@GetMapping("/getList")public List<String> getList(@RequestParam String key) {// 使用 RedisTemplate 获取列表类型数据ListOperations<String, String> listOps = redisTemplate.opsForList();return listOps.range(key, 0, -1);}
}
集合(Set):
import org.springframework.data.redis.core.SetOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class SetController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/addToSet")public void addToSet(@RequestParam String key, @RequestParam String value) {// 使用 RedisTemplate 操作集合类型数据SetOperations<String, String> setOps = redisTemplate.opsForSet();setOps.add(key, value);}@GetMapping("/getSet")public Set<String> getSet(@RequestParam String key) {// 使用 RedisTemplate 获取集合类型数据SetOperations<String, String> setOps = redisTemplate.opsForSet();return setOps.members(key);}
}
有序集合(Sorted Set):
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class SortedSetController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/addToSortedSet")public void addToSortedSet(@RequestParam String key, @RequestParam String value, @RequestParam double score) {// 使用 RedisTemplate 操作有序集合类型数据ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();zSetOps.add(key, value, score);}@GetMapping("/getSortedSet")public Set<String> getSortedSet(@RequestParam String key, @RequestParam double minScore, @RequestParam double maxScore) {// 使用 RedisTemplate 获取有序集合类型数据ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();return zSetOps.rangeByScore(key, minScore, maxScore);}
}

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

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

相关文章

系统架构设计基础

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136542641 一. 软件架构 1、软件架构或称软件体系结构&#xff0c;是指系统的一个或者多个结构&#xff0c;这些结构包括软件的构件&#xff08;可能是程序模块、类或者是中间件&#xff09;、构件的外…

谷粒商城【成神路】-【10】——缓存

目录 &#x1f9c2;1.引入缓存的优势 &#x1f953;2.哪些数据适合放入缓存 &#x1f32d;3.使用redis作为缓存组件 &#x1f37f;4.redis存在的问题 &#x1f9c8;5.添加本地锁 &#x1f95e;6.添加分布式锁 &#x1f95a;7.整合redisson作为分布式锁 &#x1f697…

学习大数据,所必需的java基础(完结篇)

文章目录 注解注解的介绍注解的定义以及属性的定义格式注解的使用注解解析的方法----AnnotatedElement接口&#xff08;扩展&#xff09; 元注解注解之在此注解 注解 注解的介绍 1.jdk1.5版本的新特性 — 一个引用数据类型 和类&#xff0c;接口&#xff0c;枚举是同一个层次…

【教程】使用小米换机来迁移数据

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 1、在新旧手机上都下载安装小米换机app&#xff1a;小米换机-小米应用商店 2、在新手机上&#xff0c;选择旧手机类型 3、授予权限 4、在旧手机上&#xff0c;授予权限 4、输入锁屏密码 5、选择发现的新手机 6、等…

EMC整改

EMC包括EMI和EMS&#xff0c;其中EMI由辐射干扰RE、传导干扰CE、谐波电流Harmonics、闪烁Flicker组成&#xff0c;EMS由静电抗扰度ESD、电快速瞬态脉冲群EFT、电压跌落DIP、传导抗扰度CS、辐射抗扰度RS、浪涌抗扰度surge、工频磁场抗扰度PMS。新产品生产出来但凡要做认证&#…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavDestination)

作为子页面的根容器&#xff0c;用于显示Navigation的内容区。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为&#xff1a;expandSaf…

嘿!AI 编码新玩法上线!

随着 AI 智能浪潮到来&#xff0c;AI 编码助手成为越来越多开发者的必备工具&#xff0c;将开发者从繁重的编码工作中解放出来&#xff0c;极大地提高了编程效率&#xff0c;帮助开发者实现更快、更好的代码编写。 通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码…

Java学习笔记------拼图游戏

图形化界面GUI GUI&#xff1a;Graphical User Interface&#xff08;图像用户接口&#xff09;&#xff0c;指采用图形化的方式显示操作界面 两套体系&#xff1a;AWT包中和Swing包中 组件 JFrame&#xff1a;最外层的窗体 JMenuBar&#xff1a;最上层菜单 JLaber&#…

【蓝桥杯】节省时间

一、对于string类型变量的连接&#xff0c;可以直接用“”或者“”来进行字符串的直接连接 string a"1"; string b"2"; string c; cab"12"; string操作符两边既可以都是string类型&#xff0c;也可是string与char类型 注意&#xff1a; (1)“”…

rj45网络变压器作用

WE-MIDC网络变压器是Wrth Elektronik公司生产的一种专业级别的网络变压器&#xff0c;也称为Wrth Elektronik网络变压器。它通常用于工业自动化、医疗保健、军事和航空航天等领域的网络通信应用。 WE-MIDC网络变压器具有以下特点&#xff1a; 电气隔离&#xff1a;WE-MIDC网络变…

一次压测经验过程的经验记录

开篇说明 如果在这里获得过启发和思考&#xff0c;希望点赞支持&#xff01;对于内容有不同的看法欢迎来信交流。 技术栈 >> java 邮箱 >> 15673219519163.com 描述 通常对于QPS较高的web应用程序在开发完成后&#xff0c;除了功能测试之外还需要做一轮压力测试…

工厂模式~

1. 简单工厂 它的主要特点是需要在工厂类中做判断&#xff0c;从而创造相应的产品。当增加新的产品时&#xff0c;就需要修改工厂类。在简单工厂模式中&#xff0c;增加新的产品需要修改工厂类&#xff0c;这违反了开闭原则&#xff08;对扩展开放&#xff0c;对修改封闭&#…

计算机网络-H3C 交换机FTP与TFTP

一、FTP与TFTP概述 FTP&#xff0c;全称为File Transfer Protocol&#xff0c;即文件传输协议&#xff0c;是一种用于在Internet上进行文件传输的应用层协议。FTP是基于客户端-服务器架构设计的&#xff0c;并使用TCP作为其传输层协议。TFTP (Trivial File Transfer Protocol) …

java继承,接口,抽象类

目录 目录 1 继承的含义 2 继承的好处 3使类与类之间产生了关系。 看这里继承-------我的理解 代码部分 接口 代码 抽象类 代码 各位友友们大家好呀&#x1f60a;&#xff01; 今天让我们继续回顾java&#xff0c;看看java中的抽象类以及接口继承是什么&#x1f914…

如何精确计算 π ?

如何精确计算 π &#xff1f; 01 原本是要回顾一下第六章内容&#xff0c;也就是“间隔性重复”。但我已经迫不及待&#xff0c;想要知道如何精确计算 π &#xff0c;因此&#xff0c;我们快走一步&#xff0c;来探讨一下 π 的计算。 对于 π 的计算&#xff0c;我从学校时…

Python基础学习(5)流程控制

文章目录 一. 程序三大执行流程二. 分支结构1.单分支结构(if)2.双分支结构(if..else)3.多分支结构(if..elif..else) 二,缩进(tab键)三,循环结构1.while循环2.for循环①遍历字典 五.break&#xff0c;continue和pass语句1.break&#xff0c;continue2.pass Python基础学习(1)基本…

蓝桥杯(日期问题纯暴力)

纯纯暴力&#xff0c;写的想吐&#xff0c;玛德服了。 但是复习了vector去重方法&#xff0c;日期的合法性判断。 #include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std; vector<int> res; st…

浪潮信息数据中心管理平台InManage升级发布 新增三大场景功能

在AIGC应用日益广泛的当下&#xff0c;浪潮信息聚焦AIGC在数据中心运维管理中面临的难题&#xff0c;进一步通过技术创新升级功能及体验&#xff0c;为AIGC的高效应用创造了良好的基础。近日&#xff0c;浪潮信息数据中心管理平台InManage升级发布&#xff0c;新增资产数字化管…

强化学习(一)

#! https://zhuanlan.zhihu.com/p/686235471 深度强化学习&#xff08;一&#xff09;&#xff08;基础概念&#xff09; 一.马尔可夫决策过程 Agent:智能体&#xff0c;动作或决策对象 Environment: 与智能体交互的对象&#xff0c;可随时间变化 State&#xff1a;对某一…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …