Redis实例搭建

本文介绍了如何搭建Redis实例,并详细讲解了Spring Cache中@Cacheable、@CachePut、@CacheEvict和@Caching等注解的使用方法,包括缓存配置、序列化设置以及测试类的编写。通过示例代码展示了如何在Java项目中集成Redis进行数据缓存。

https://github.com/lumis-githib/Study.git
直接下载实例,自己耍耍学的更来劲!

官网的解释:Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
第一步、搭建一个web项目,要引用一些必要的包操作数据库的mybatis,redis等,直接贴pom.xml文件吧。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
##第二步
搭建数据库和增删改查功能;也不多说直接看代码吧,我会在最后贴出项目的GitHub地址。需要注意的是我代码中对注解的注释。
package com.zhiyuan.cache.service;

import com.zhiyuan.cache.bean.Employee;
import com.zhiyuan.cache.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;

import java.sql.SQLOutput;

/**

  • @ClassName EmployeeService
  • @Description Todo
  • @Author ming.lu
  • @Date 2020/3/1 18:22
    /
    @Service
    /
    *
  • CacheConfig缓存配置,制定缓存块名称。写在类上方法上就不用写了

*/
@CacheConfig(cacheNames=“emp”)
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;

/**
 * Cacheable:以后有相同的查询不走数据库,直接取自缓存。
 * 属性:
 * 1、value:制定缓存组,
 * 2、key:制定缓存的主键。eg:#id
 *        也可以用另外一种表达方式 SPEL .eg:#root.args[0]含义是取自当前参数的第一个参数值
 * 3、keyGenerator:主键生成器,可以自己制定key的生成主键id eg:keyGenerator = "myKeyGenerator"
 * 4、cacheManager:缓存管理器。在那个缓存管理器取数据。
 * 5、cacheResolver:缓存解析器,与管理器二选一,功能类似。
 * 6、condition:符合条件才进行缓存。eg:#id>0,,,eg2 :condition = "#id>1 and #root.methodName.equals('getEmployeeById')",
 * 7、unless:满足条件就不缓存。可以取结果值判断是否缓存。eg:“#result==null” eg2:unless = "#a0==2"
 * @param id
 * @return
 */
@Cacheable(key="#id")
public Employee getEmployeeById(Integer id){
    System.out.println("查询"+id+"号员工");
   return employeeMapper.getEmpById(id);

}
/**
 * CachePut:调用方法也缓存数据
 * 修改了数据库的某个数据,同时更新缓存。
 * 1.调用方法修改
 * 2.缓存修改之后的结果
 * 指定 key:#result.id
 * 也可以用employee.id
 * 测试步骤:先查询,然后再更新。
 * 先
 */
@CachePut
public Employee updateEmployee(Employee employee){
    System.out.println("调用了数据库!");
    employeeMapper.updateEmployee(employee);
return employee;
}

/**
 * CacheEvict:缓存清空组件,先清空制定缓存,再操作数据库。
 * key:制定要清空的id
 * allentries=true,删除所有组件。
 * beforeInvocation 缓存的清除是在方法执行前还是执行后。默认false 在方法执行前,true是方法执行后。
 *
 */
@CacheEvict(key="#id")
public void delEmployeeById(Integer id){
    System.out.println("删除"+id+"号员工");

// employeeMapper.deleteEmp(id);

}
/**
 * catching是上述三个注解的综合体。
 *
 */
@Caching(
        cacheable = {
                @Cacheable(key="#lastname")
        },put = {
                @CachePut(key="#result.id"),
                @CachePut(key = "#result.email")
        }

)
public Employee getEmpByName(String lastname){
    System.out.println("查询"+lastname+"号员工");
    return employeeMapper.getEmpByName(lastname);
}

}
代码中缓存注解的使用方法讲解:
1、@Cacheable:先走缓存,有相同id直接查询缓存,就不走数据库查询。
属性:
value:制定缓存组。
key:制定缓存的主键。eg:#id
也可以用另外一种表达方式 SPEL .eg:#root.args[0]含义是取自当前参数的第一个参数值。
keyGenerator : 主键生成器,可以自己制定key的生成主键id eg:keyGenerator = “myKeyGenerator”
cacheManager:缓存管理器。在那个缓存管理器取数据。
cacheResolver:缓存解析器,与管理器二选一,功能类似。
condition:符合条件才进行缓存。eg:#id>0,eg2 :condition = “#id>1 and #root.methodName.equals(‘getEmployeeById’)”。
unless:满足条件就不缓存。可以取结果值判断是否缓存。eg:“#resultnull” eg2:unless = "#a02"
2、CachePut : 调用方法也缓存数据,运行机制,先去修改数据库,然后再更新缓存。
key:#result.id,employee.id。
3、CacheEvict:缓存清空组件,先清空制定缓存,再操作数据库。
key:制定要清空的id。
allentries=true,删除所有组件。
beforeInvocation 缓存的清除是在方法执行前还是执行后。默认false 在方法执行前,true是方法执行后。
4、catching是上述三个注解的综合体。
eg:@Caching(
cacheable = {
@Cacheable(key="#lastname")
},put = {
@CachePut(key="#result.id"),
@CachePut(key = “#result.email”)
}

)
例子解释:分别将key等于三个字段的值进行缓存。当key等于lastname,id,email任一值时,都会直接取缓存信息。
##第三步:缓存的开启配置
	#链接数据库    
	spring.datasource.url=jdbc:mysql://192.168.174.131:3306/lumis_test
	#数据库用户密码
	spring.datasource.username=root
	spring.datasource.password=rd.123456
	#开启驼峰命名
	mybatis.configuration.map-underscore-to-camel-case=true
	#开启打印sql语句
	logging.level.com.zhiyuan.cache.mapper=debug
	#redis数据库地址,端口默认6379,不写了,用户默认root
	spring.redis.host=192.168.174.131
	spring.redis.password=rd.123456

##第四步:
序列化配置:
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Employee> employeeredisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer serializer=new Jackson2JsonRedisSerializer(Employee.class);
template.setDefaultSerializer(serializer);
return template;
}
第五步:测试类编写:
//操作对象
@Autowired
RedisTemplate<Object, Employee> employeeRedisTemplate;
@Test
void test01(){
Employee employee=employeeMapper.getEmpById(1);
// stringRedisTemplate.opsForValue().append(“001”,“helloword”);
// System.out.println(stringRedisTemplate.opsForValue().get(“001”));
employeeRedisTemplate.opsForValue().set(“002”,employee);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值