目录
SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value 只有在 key 不存在时设置 key 的值编辑
HSET key field value将哈希表 key 中的字段 field 的值设为 value
编辑 HGET key field 获取存储在哈希表中指定字段的值
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
编辑LRANGE key start stop 获取列表指定范围内的元素
SADD key member1[member2] 向集合添加一个或多个成员
编辑SINTER key1 [key2] 返回给定所有集合的交集
编辑SUNION key1 [key2] 返回所有给定集合的并集
编辑SREM key member1 [member2]删除集合中一个或多个成员
ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员编辑
KEYS pattern 查找所有符合给定模式( pattern)的 key
编辑DEL key 该命令用于在 key 存在是删除 key
Redis简介
Redis是一个基于内存的 key-value 结构数据库。
基于内存存储,读写性能高。适合存储热点数据(热点商品、资讯、新闻)
Redis是一种基于内存、开源、支持多种数据结构,并具备可选持久化的键值对存储数据库。
Redis,全称为Remote Dictionary Server,是一个使用ANSIC编写的开源软件,遵守BSD协议。它主要用作数据库、缓存和消息代理。Redis区别于传统关系型数据库的是其NoSQL的特性,能够提供低延迟的高速读写操作,支撑海量数据和流量,同时拥有大规模集群的管理功能和较低的运营成本。更多关于Redis的详细分析如下:
1. 基本特性
高性能:由于Redis基于内存运行,相较传统的磁盘数据库,它能提供极低延迟的读写速度。作为对比,Redis能每秒进行大约110,000次写入操作或81,000次读取操作。
数据类型丰富:Redis不仅支持简单的字符串,还包括哈希、列表、集合、有序集合等五种主要数据类型,以及一种虚拟类型,这使得Redis可以满足各种不同应用场景的需求。
原子性操作:所有的Redis操作都是原子性的,保证了操作的完整性和一致性,尤其在多客户端并发访问时,能够避免数据冲突和服务器不一致的问题。
2. 应用场景
缓存系统:利用Redis的高速读写特性,可以大幅提升系统的读性能。适合缓存那些“热点”数据,如高频读取但写入较少的数据。
计数器:Redis的原子操作使得它成为实现计数器的优选方案,常用于点赞数、访问量等需要精确同步的场景。
消息队列:发布订阅模式允许消息在各个客户端之间传递,适用于聊天服务、实时通知等功能。
3. 技术特点
单线程模型:Redis采用单进程单线程的方式运行,减少了上下文切换的开销,同时简化了并发处理的复杂性。
数据结构设计:Redis有着独特的数据结构设计,例如简单动态字符串(SDS),与C字符串相比,它在获取字符串长度、减少内存重新分配次数等方面进行了优化。
事务支持:通过MULTI、EXEC和DISCARD命令,Redis支持将多个命令序列化后按顺序执行,保证命令的原子性。
4. 部署架构
主从复制:通过主从复制配置,可以提高数据的可用性,同时用从节点分担读请求,减轻主节点压力。
高可用解决方案:Redis Sentinel提供了监控、通知和自动故障转移的功能,保障了服务的高可用性。
分布式集群:为了应对内存资源的横向扩展需求,Redis Cluster让客户端可以感觉到一个集中式服务,而实际上由多个节点组成。
总而言之,Redis以其高性能、丰富的数据类型、广泛的应用场景和技术特性,成为了现代互联网技术中不可或缺的关键组件。从简单的缓存需求到复杂的消息队列,Redis都能提供高效可靠的解决方案。在选择使用Redis时,除了考虑如何充分发挥其性能优势外,还需关注合适的配置和优化策略以确保安全和效率。
Redis下载
启动Redis服务
redis-server.exe redis.windows.conf
客户端连接
redis-cli.exe
Redis数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串 string 普通字符串,Redis中最简单的数据类型
哈希 hash 也叫散列,类似于Java中的HashMap结构
列表 list 按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
集合 set 无序集合,没有重复元素,类似于Java中的Hashset
有序集合 sorted set/zset 集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
Redis常用命令
字符串操作命令
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value 只有在 key 不存在时设置 key 的值
![](/i/ll/?i=direct/b9db2c8fa80a413bb1e14e76d4cdb57c.png)
哈希操作命令
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
列表操作命令
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
![](/i/ll/?i=direct/d54760e2970a42df8b527fe71d6fc681.png)
LRANGE key start stop 获取列表指定范围内的元素
![](/i/ll/?i=direct/1e7920545ac346319f324e716bc01ce6.png)
RPOP key 移除并获取列表最后一个元素
![](/i/ll/?i=direct/7dce900077c8485a92145dbbcd4ee200.png)
LLEN key 获取列表长度
集合操作命令
SADD key member1[member2] 向集合添加一个或多个成员
![](/i/ll/?i=direct/dfe46a7ca69348e580bf18e10edd33d0.png)
SMEMBERS key 返回集合中的所有成员
![](/i/ll/?i=direct/159489492b194d29a51458359b9fa370.png)
SCARD key 获取集合的成员数
![](/i/ll/?i=direct/0da7282f0d22481694f38fcfc015c2f6.png)
SINTER key1 [key2] 返回给定所有集合的交集
![](/i/ll/?i=direct/bdd87f48b95b4ee0bf986de30a3529a1.png)
SUNION key1 [key2] 返回所有给定集合的并集
![](/i/ll/?i=direct/212e659488f248b4a205464d69a9764f.png)
SREM key member1 [member2]删除集合中一个或多个成员
有序集合操作命令
ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员
![](/i/ll/?i=direct/70dd98ea86bd49599044c2ed9ae02965.png)
通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令:
KEYS pattern 查找所有符合给定模式( pattern)的 key
![](/i/ll/?i=direct/8e534c87c48a4968b5f97b3baae5e8bb.png)
EXISTS key 检查给定 key 是否存在
![](/i/ll/?i=direct/77065ddfd50340a4b2480d6d3f77892c.png)
TYPE key 返回 key 所储存的值的类型
![](/i/ll/?i=direct/96fbcc1afdb74bdeb4e4cb6b034a7e84.png)
DEL key 该命令用于在 key 存在是删除 key
Redis的Java客户端
Redis 的 Java 客户端很多,这里就使用Spring Data Redis
Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发包进行了高度封装。
在 Spring 项目中,可以使用spring Data Redis来简化操作。
Spring Data Redis使用方式
操作步骤:
导入Spring Data Redis 的maven坐标
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis数据源
application.yml:
redis:
host: localhost
port: 6379
password: 123456
database: 10
编写配置类,创建RedisTemplate对象
package com.sky.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
通过RedisTemplate对象操作Redis
1、操作字符串类型的数据
//操作字符串类型的数据
@Test
public void testString(){
//set
redisTemplate.opsForValue().set("city","北京");
//get
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println(city);
//setex
redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
//setnx
redisTemplate.opsForValue().setIfAbsent("csdn",1);
redisTemplate.opsForValue().setIfAbsent("csdn",2);
}
2、操作哈希类型的数据
//操作哈希类型的数据
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//hset
hashOperations.put("100","name","xiaohuolong");
hashOperations.put("100","age","18");
//hget
String name =(String) hashOperations.get("100", "name");
System.out.println(name);
//hkeys
Set keys = hashOperations.keys("100");
keys.forEach(s-> System.out.println(s));
//hvals
List values = hashOperations.values("100");
values.forEach(s-> System.out.println(s));
//hdel
hashOperations.delete("100","age");
}
3、操作列表类型数据
//操作列表类型数据
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//lpush
listOperations.leftPush("mylist","a");
listOperations.leftPushAll("mylist","b","c","d");
//lrange
List mylist = listOperations.range("mylist", 0, -1);
mylist.forEach(s-> System.out.println(s));
//rpop
listOperations.rightPop("mylist");
//llen
listOperations.size("mylist");
}
4、操作集合类型数据
//操作集合类型数据
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//sadd
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
// smembers
Set set1 = setOperations.members("set1");
set1.forEach(s-> System.out.println(s));
// scard
Long size = setOperations.size("set1");
System.out.println(size);
// sinter
Set intersect = setOperations.intersect("set1", "set2");
intersect.forEach(s-> System.out.println(s));
// sunion
Set union = setOperations.union("set1", "set2");
union.forEach(s-> System.out.println(s));
// srem
setOperations.remove("set1","a","b");
}
5、操作有序集合类型
//操作有序集合类型
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//zadd
zSetOperations.add("zset1","a",10);
zSetOperations.add("zset1","b",13);
zSetOperations.add("zset1","c",11);
// zrange
Set zset1 = zSetOperations.range("zset1", 0, -1);
zset1.forEach(s-> System.out.println(s));
// zincrby
zSetOperations.incrementScore("zset1","a",5);
//zrem
zSetOperations.remove("zset1","a");
}
6、操作通用命令
//操作通用命令
@Test
public void testCommon(){
// keys
Set keys = redisTemplate.keys("*");
keys.forEach(s-> System.out.println(s));
// exists
Boolean name = redisTemplate.hasKey("name");
// type
keys.forEach(s-> System.out.println(redisTemplate.type(s)));
// del
redisTemplate.delete("mylist");
}
这一期就说到这里啦
努力遇见更好的自己!!!