目录
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 的值

哈希操作命令
HSET key field value将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
列表操作命令
LPUSH key value1 [value2] 将一个或多个值插入到列表头部

LRANGE key start stop 获取列表指定范围内的元素

RPOP key 移除并获取列表最后一个元素

LLEN key 获取列表长度
集合操作命令
SADD key member1[member2] 向集合添加一个或多个成员

SMEMBERS key 返回集合中的所有成员

SCARD key 获取集合的成员数

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 ...] 移除有序集合中的一个或多个成员

通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令:
KEYS pattern 查找所有符合给定模式( pattern)的 key

EXISTS key 检查给定 key 是否存在

TYPE key 返回 key 所储存的值的类型

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");
}
这一期就说到这里啦
努力遇见更好的自己!!!