Redis是一个基于内存key-value结构NoSql数据库。相比于常规的数据库,Redis

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)和在短时间内有大量访问的数据
  • 应用广泛

Redis启动

安装好Redis并配置好环境变量之后,在cmd中使用redis-server启动redis,Redis服务默认端口号为6379。

使用命令redis-cli连接客户端,默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:-h ip地址-p 端口号 -a 密码(如果有)

也可以使用Another-Redis-Desktop-Manager图形化工具连接和管理Redis

Redis数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(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 ...]:移除有序集合中的一个或多个成员

通用命令

  • KEYS pattern:查找所有符合给定模式(pattern)的key
  • EXISTS key:检查给定key是否存在
  • TYPE key:返回key所储存的值的类型
  • DEL key:该命令用于在key存在时删除 key

在Java中操作Redis

Redis的Java客户端很多,常用的有:JedisLettuceSpring Data Redis

其中Spring Data Redis是Spring的一部分,对Redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操作。

Spring Data Redis

  1. 导入Spring Data Redis的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis数据源
spring:
redis:
host: ${lty.redis.host}
port: ${lty.redis.port}
database: ${lty.redis.database}
  1. 编写配置类,创建RedisTemplate对象
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
// 使用StringRedisSerializer将key序列化,避免乱码
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
  1. 通过RedisTemplate对象操作Redis
@RestController
@RequestMapping("/")
public class Test {
@Autowired
private DishService dishService;
@Autowired
private RedisTemplate redisTemplate;

@GetMapping
public Result<List<DishVO>> test(Long categoryId) {
String key = "dish_" + categoryId;
List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
if(list != null){
// redis中存在数据,直接返回
return Result.success(list);
}
// 否则从数据库中查数据
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);
list = dishService.listWithFlavor(dish);
// 查出来的数据加入到redis中
redisTemplate.opsForValue().set(key, list);

return Result.success(list);
}
}

Spring Data Redis使用方式

RedisTemplate针对大量api进行了归类封装,将同一数据类型的操作封装为对应的Operation接口,具体分类如下:

  • ValueOperations:string类型数据操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:hash类型的数据操作
  • ListOperations:list类型的数据操作

String操作

set void set(K key, V value):添加获取数据

set void set(K key, V value, long timeout, TimeUnit unit):设置数据有效期

TimeUnit.DAYS //天
TimeUnit.HOURS //小时
TimeUnit.MINUTES //分钟
TimeUnit.SECONDS //秒
TimeUnit.MILLISECONDS //毫秒

set void set(K key, V value, long offset):根据key设置value指定下标字符

get V get(Object key):Get操作

getAndSet V getAndSet(K key, V value):设置键的字符串值并返回其旧值

append Integer append(K key, String value):根据key拼接value的值,如果被拼接的key没值则为空字符串

size Long size(K key):根据key获取value的长度

List操作

Long size(K key):返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。当key存储的值不是列表时返回错误。

Long leftPush(K key, V value):(从左边插入)将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。

Long leftPushAll(K key, V... values):(从左边插入)批量把一个数组插入到列表中

Long rightPush(K key, V value):(从右边插入)将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从右边插入)

Long rightPushAll(K key, V... values):(从右边插入)批量把一个数组插入到列表中

void set(K key, long index, V value):在列表中index的位置设置value值

Long remove(K key, long count, Object value):从存储在键中的列表中删除等于值的元素的第一个计数事件。

计数参数以下列方式影响操作:
count> 0:删除等于从头到尾移动的值的元素。
count <0:删除等于从尾到头移动的值的元素。
count = 0:删除等于value的所有元素。

V index(K key, long index):根据下标获取列表中的值,下标是从0开始的,-1为获取全部

V leftPop(K key):弹出最左边的元素

V rightPop(K key):弹出最右边的元素

Hash操作

Long delete(H key, Object... hashKeys):删除给定的哈希hashKeys

Boolean hasKey(H key, Object hashKey):判断哈希hashKey是否存在

HV get(H key, Object hashKey):从键中的哈希获取给定hashKey的值

Set keys(H key):获取key所对应的散列表的key

Long size(H key):获取key所对应的散列表的大小个数

void putAll(H key, Map<? extends HK, ? extends HV> m):使用m中提供的多个散列字段设置到key对应的散列表中

void put(H key, HK hashKey, HV value):设置散列hashKey的值

List values(H key):获取整个哈希存储的值根据密钥

Map<HK, HV> entries(H key):获取整个哈希存储根据密钥

Cursor<Map.Entry<HK, HV>> scan(H key, ScanOptions options):使用Cursor在key的hash中迭代,相当于迭代器。

Set操作

Long add(K key, V... values):无序集合中添加元素,返回添加个数也可以直接在add里面添加多个值 如:template.opsForSet().add(“setTest”,”aaa”,”bbb”)

Long remove(K key, Object... values):移除集合中一个或多个成员

V pop(K key):移除并返回集合中的一个随机元素

Boolean move(K key, V value, K destKey):将 member 元素从 source 集合移动到 destination 集合

Long size(K key):无序集合的大小长度

et members(K key):返回集合中的所有成员

Cursor scan(K key, ScanOptions options):遍历set

ZSet操作

Boolean add(K key, V value, double score):新增一个有序集合,存在的话为false,不存在的话为true

Long add(K key, Set<TypedTuple> tuples):新增一个有序集合

Long remove(K key, Object... values):从有序集合中移除一个或者多个元素

Long rank(K key, Object o):返回有序集中指定成员的排名,其中有序集成员按分数值递增(从小到大)顺序排列

Set range(K key, long start, long end):通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列

Long count(K key, double min, double max):通过分数返回有序集合指定区间内的成员个数

Long size(K key):获取有序集合的成员数,内部调用的就是zCard方法

Double score(K key, Object o):获取指定成员的score值

Long removeRange(K key, long start, long end):移除指定索引位置的成员,其中有序集成员按分数值递增(从小到大)顺序排列

Cursor<TypedTuple> scan(K key, ScanOptions options):遍历zset

Spring Cache

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

它提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine
  • Redis

需要引入Maven坐标

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

常用注解

注解 说明
@EnableCaching 开启缓存注解功能,通常加在启动类上
@Cacheable(cacheNames=”数据库名”,key=”存储的键”) 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut 将方法的返回值放到缓存中
@CacheEvict(cacheNames = “数据库名”,[allEntries(是否全部删除) = true],key = “要删除的键”) 将一条或多条数据从缓存中删除