Redis 是一个开源的、基于内存的数据存储系统,它通过键值对的方式存储数据。是单线程的内存数据库,采用事件驱动模型来处理并发请求。它使用非阻塞的 I/O 多路复用机制来实现高性能的并发访问。数据库通常会将数据存储在内存中,这样可以提高数据读写的速度。此外,Redis 也支持将数据持久化到磁盘上,以防止数据丢失。采用基于内存的数据结构以及高效的数据存储和检索算法,从而提供快速的数据访问速度。
单线程模型: Redis 是单线程的,即通过一个事件循环来处理所有的客户端请求。这意味着 Redis 在任意时刻只能处理一个请求,不需要考虑多线程并发访问的同步和竞争条件,简化了系统设计和开发。
事件驱动模型: Redis 使用事件驱动模型来管理客户端请求和网络 I/O。它采用非阻塞 I/O 多路复用技术,如 epoll(Linux)、kqueue(BSD)、select 等,实现在单线程中同时处理多个连接的读写操作,提高系统的并发性能。
内存数据库: Redis 数据通常存储在内存中,这样可以加快数据的读写速度。为了防止数据丢失,Redis 提供了持久化机制,可以将数据定期保存到磁盘上,保证数据的持久性。
数据结构和算法: Redis 使用高效的数据结构和算法来支持各种数据类型的存储和操作,如哈希表、跳表等。这些数据结构和算法使得 Redis 能够在内存中快速存储和检索数据,并提供高效的数据操作命令。
主从复制和集群架构: Redis 支持主从复制和集群架构,可以实现数据的备份和负载均衡。主从复制通过将主节点的数据复制到从节点,实现数据的备份和故障恢复;集群架构则可以横向扩展 Redis 集群的性能和容量。
总的来说,Redis 的运行原理基于单线程、事件驱动的模型,利用内存数据库和高效的数据结构算法来提供快速的数据存储和处理能力。通过持久化机制、主从复制和集群架构等特性,Redis 实现了高性能、高可用性和可伸缩性,成为广泛应用于缓存、会话存储、消息队列等场景的流行数据库解决方案。
字符串(String):
哈希表(Hash):
列表(List):
集合(Set):
有序集合(Sorted Set):
(下面还有Java Spring Boot示例代码,需要的请往下翻)
- 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();
- }
- }
- 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
user = jedis.hgetAll("user:1"); - System.out.println(user);
-
- jedis.close();
- }
- }
- 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
list = jedis.lrange("list1", 0, -1); - System.out.println(list);
-
- jedis.close();
- }
- }
- 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
set = jedis.smembers("set1"); - System.out.println(set);
-
- jedis.close();
- }
- }
- 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
set = jedis.zrangeByScore("sortedset1", 0, 2); - System.out.println(set);
-
- jedis.close();
- }
- }
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- public class StringController {
-
- @Autowired
- private 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);
- }
- }
- 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 {
-
- @Autowired
- private RedisTemplate
redisTemplate; -
- @PostMapping("/setHash")
- public void setHash(@RequestParam String key, @RequestParam String field, @RequestParam String value) {
- // 使用 RedisTemplate 操作哈希表类型数据
- HashOperations
hashOps = redisTemplate.opsForHash(); - hashOps.put(key, field, value);
- }
-
- @GetMapping("/getHash")
- public String getHash(@RequestParam String key, @RequestParam String field) {
- // 使用 RedisTemplate 获取哈希表类型数据
- HashOperations
hashOps = redisTemplate.opsForHash(); - return hashOps.get(key, field);
- }
- }
- import org.springframework.data.redis.core.ListOperations;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- public class ListController {
-
- @Autowired
- private RedisTemplate
redisTemplate; -
- @PostMapping("/pushToList")
- public void pushToList(@RequestParam String key, @RequestParam String value) {
- // 使用 RedisTemplate 操作列表类型数据
- ListOperations
listOps = redisTemplate.opsForList(); - listOps.leftPush(key, value);
- }
-
- @GetMapping("/getList")
- public List
getList(@RequestParam String key) { - // 使用 RedisTemplate 获取列表类型数据
- ListOperations
listOps = redisTemplate.opsForList(); - return listOps.range(key, 0, -1);
- }
- }
- import org.springframework.data.redis.core.SetOperations;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- public class SetController {
-
- @Autowired
- private RedisTemplate
redisTemplate; -
- @PostMapping("/addToSet")
- public void addToSet(@RequestParam String key, @RequestParam String value) {
- // 使用 RedisTemplate 操作集合类型数据
- SetOperations
setOps = redisTemplate.opsForSet(); - setOps.add(key, value);
- }
-
- @GetMapping("/getSet")
- public Set
getSet(@RequestParam String key) { - // 使用 RedisTemplate 获取集合类型数据
- SetOperations
setOps = redisTemplate.opsForSet(); - return setOps.members(key);
- }
- }
- import org.springframework.data.redis.core.ZSetOperations;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- public class SortedSetController {
-
- @Autowired
- private RedisTemplate
redisTemplate; -
- @PostMapping("/addToSortedSet")
- public void addToSortedSet(@RequestParam String key, @RequestParam String value, @RequestParam double score) {
- // 使用 RedisTemplate 操作有序集合类型数据
- ZSetOperations
zSetOps = redisTemplate.opsForZSet(); - zSetOps.add(key, value, score);
- }
-
- @GetMapping("/getSortedSet")
- public Set
getSortedSet(@RequestParam String key, @RequestParam double minScore, @RequestParam double maxScore) { - // 使用 RedisTemplate 获取有序集合类型数据
- ZSetOperations
zSetOps = redisTemplate.opsForZSet(); - return zSetOps.rangeByScore(key, minScore, maxScore);
- }
- }