首页
资源库
留言板
站点统计
Search
1
[Java] @Data 注解 代码变得简洁
205 阅读
2
[Vue] Vue 使用ElementUI组件
162 阅读
3
[Java] 安装JDK8
131 阅读
4
[Java] 发送消息
122 阅读
5
[C语言] 游戏贪吃蛇
108 阅读
Tools
编程
C/C++
Java
mySQL
python
PHP
Vue
嵌入式系统编程
HTML
数据结构
TypeScript
登录
Search
标签搜索
Java
SpringBoot
数据结构
C/C++
mysql
Vue
tools
redis
游戏
TomCat
linux
arm
嵌入式系统
Mqtt
PHP
maven
图床
github
IDEA
jar
星如雨
累计撰写
48
篇文章
累计收到
2
条评论
首页
栏目
Tools
编程
C/C++
Java
mySQL
python
PHP
Vue
嵌入式系统编程
HTML
数据结构
TypeScript
页面
资源库
留言板
站点统计
搜索到
3
篇与
的结果
2023-03-14
[spring boot] spring boot 中redis 工具类
在项目启动目录创建 utils -> RedisCache.javaimport java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; /** * spring redis 工具类 **/ @SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component public class RedisCache { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 */ public <T> void setCache(final String key, final T value) { redisTemplate.opsForValue().set(key, value); } /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeUnit 时间颗粒度 */ public <T> void setCache(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } /** * 获取有效时间 * * @param key Redis键 * @return 有效时间 */ public long getExpire(final String key) { return redisTemplate.getExpire(key); } /** * 判断 key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } /** * 获得缓存的基本对象。 * * @param key 缓存键值 * @return 缓存键值对应的数据 */ public <T> T getCache(final String key) { ValueOperations<String, T> operation = redisTemplate.opsForValue(); return operation.get(key); } /** * 删除单个对象 * * @param key */ public boolean delete(final String key) { return redisTemplate.delete(key); } /** * 删除集合对象 * * @param collection 多个对象 * @return */ public boolean delete(final Collection collection) { return redisTemplate.delete(collection) > 0; } /** * 缓存List数据 * * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @return 缓存的对象 */ public <T> long setCacheList(final String key, final List<T> dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } /** * 获得缓存的list对象 * * @param key 缓存的键值 * @return 缓存键值对应的数据 */ public <T> List<T> getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); } /** * 缓存Set * * @param key 缓存键值 * @param dataSet 缓存的数据 * @return 缓存数据的对象 */ public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); Iterator<T> it = dataSet.iterator(); while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; } /** * 获得缓存的set * * @param key * @return */ public <T> Set<T> getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); } /** * 缓存Map * * @param key * @param dataMap */ public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } } /** * 获得缓存的Map * * @param key * @return */ public <T> Map<String, T> getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * * @param key Redis键 * @param hKey Hash键 * @param value 值 */ public <T> void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 获取Hash中的数据 * * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ public <T> T getCacheMapValue(final String key, final String hKey) { HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } /** * 获取多个Hash中的数据 * * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * 删除Hash中的某条数据 * * @param key Redis键 * @param hKey Hash键 * @return 是否成功 */ public boolean deleteCacheMapValue(final String key, final String hKey) { return redisTemplate.opsForHash().delete(key, hKey) > 0; } /** * 获得缓存的基本对象列表 * * @param pattern 字符串前缀 * @return 对象列表 */ public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); } }
2023年03月14日
36 阅读
0 评论
0 点赞
2022-04-24
[Java] SpringBoot redis 注解缓存数据库数据
在数据库中执行创建数据库以创建一个评论表为例创建数据库DROP DATABASE IF EXISTS `springbootdata`; CREATE DATABASE `springbootdata`;创建表CREATE TABLE `t_comment` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id', `content` longtext COMMENT '评论内容', `author` varchar(200) DEFAULT NULL COMMENT '评论作者', `a_id` int(20) DEFAULT NULL COMMENT '关联的文章id', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;添加部分数据INSERT INTO `t_comment` VALUES ('1', '1', '1', '1'), ('2', '赞一个', 'tom', '1'), ('3', '很详细', 'kitty', '1'), ('4', '很好,非常详细', '张三', '1'), ('5', '很不错', '张杨', '2');SpringBoot 部分引入依赖 <dependencies> <!-- spring-boot-starter-web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 核心:自动配置的支持、日志、yaml解析等--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 阿里巴巴解析json依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!-- httpclient请求依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <!-- 爬虫+解析--> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </dependency> <!-- junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- SpringBoot test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> <scope>runtime</scope> </dependency> <!-- myBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <!-- alibaba 数据库池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.22</version> </dependency> <!-- jpa 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- 可视化接口API--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.4.0</version> </dependency> <!-- thymeleaf 模板--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- 文件下载依赖--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <!-- Tomcat依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- Redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies>配置redis# 配置MySQL数据库 数据库地址 用户名 密码 spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 # 显示 jpa sql 语句 执行jpa 的时候会在控制台打印jpa 语句 spring.jpa.show-sql=true # 配置第三方数据库源 druid spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.initial-size=20 spring.datasource.druid.min-idle=10 spring.datasource.druid.max-active=100 # 配置 Redis spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= 创建 Discuss 实例Discuss// 使数据库数据映射到 对象 @Entity(name = "t_comment") // 序列化,作用使数据不会出现乱码情况 public class Discuss implements Serializable { /** * @Id 表示 某属性 在数据表中是 主键 * @GeneratedValue : 与 @Id 标注在同一个位置用于表示属性对应主键生成策略 * 生成策略 : * TABLE (使用一个特定的数据库表来保存主键) * SEQUENCE (不支持主键自增的数据库主键生成策略) * INDETITY (主键自增) * AUTO (JPA 自动选择前面三个合适的策略,[默认选项]) * */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String content; private String author; /** * @Column : 对于属性和表字段不同时,使用 name 属性 将类属性 与 表字段属性对应 * */ @Column(name = "a_id") private Integer aId; // 省略 getter,setter 和 toString 方法 }创建 DiscussRepository 管理sql语句public interface DiscussRepository extends JpaRepository<Discuss, Integer> { // @Transactional 声明是一个事务,执行出错会回滚,控制事务 @Transactional @Modifying @Query(value = "update t_comment c set c.author=?1 where c.id=?2") public int updateDiscuss(String author,Integer id); }创建 DiscussService 缓存一些数据@Service public class DiscussService { // CommentRepository 继承自 JpaRepository 自带增删改查的方法 @Autowired private DiscussRepository discussRepository; // 通过id 查找 评论 // 缓存这个查询的结果,并以参数为缓存标识符(保证唯一) @Cacheable(cacheNames = "comment",unless = "#result==null") public Discuss findById(int id){ Optional<Discuss> discuss = discussRepository.findById(id); // 判断查询的类是否存在 当类存在时 则为 true if (discuss.isPresent()){ return discuss.get(); } return null; } // 更新评论 // 更新缓存,标识符为 评论id, result 表示评论 @CachePut(cacheNames = "comment",key = "#result.id") public Discuss updateDiscuss(Discuss discuss){ // 根据评论的 id 修改 author discussRepository.updateDiscuss(discuss.getAuthor(),discuss.getaId()); return discuss; } // 根据id 删除评论 // 清除缓存注解 @CacheEvict(cacheNames = "comment") public void deleteDiscuss(int discuss_id){ discussRepository.deleteById(discuss_id); } }创建 DiscussController 控制页面访问// 返回json格式字符串 @RestController public class DiscussController { // 注册组件 评论服务 @Autowired private DiscussService commentService; // 访问/get/id 可根据评论id 查找相对应的评论 // @PathVariable 自动映射 URL 绑定的占位符 {} @GetMapping("/get/{id}") public Discuss findById(@PathVariable("id") int comment_id){ Discuss discuss = commentService.findById(comment_id); return discuss; } @GetMapping("/update/{id}/{author}") public Discuss updateDiscuss(@PathVariable("id") int commet_id,@PathVariable("author") String author){ Discuss discuss = commentService.findById(commet_id); discuss.setAuthor(author); Discuss discuss1 = commentService.updateDiscuss(discuss); return discuss1; } @GetMapping("/delete/{id}") public void deleteDiscuss(@PathVariable("id") int comment_id){ commentService.deleteDiscuss(comment_id); } }运行结果{card-default label="提示" width="100%"}在浏览器中已经访问过http://127.0.0.1:8088/update/1/jerry,所以数据和刚插入的有所不同{/card-default}在浏览器中访问路径 http://127.0.0.1:8088/get/1控制台会输出redis 客户端也会进行缓存刷新浏览器,发现控制台不会再次输出sql语句更改访问路径信息http://127.0.0.1:8088/get/2redis 客户端会再次缓存数据
2022年04月24日
35 阅读
0 评论
0 点赞
2022-04-24
[Java] SpringBoot redis 缓存(初级)
下载 redis小皮面板(Windows系统)如果你是Linux系统 可以进入 官网下载 SpringBoot 项目添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>添加配置信息application.propertiesspring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=创建实体对象在model 包 或 domain 包下创建(规范)// Redis 缓存的键值名 @RedisHash("person") public class Person { // 实体对象的唯一表示 @Id private String id; // 标识对应属性在 Redis 中生成的二级索引 @Indexed private String name; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }创建 Repository方便管理对应的CRUD方法// Person 的 Repository public interface PersonRepository extends CrudRepository<Person, String> { // 查询所有的Person @Override List<Person> findAll(); // 通过id 查找 Person List<Person> findPeopleById(String id); // 通过 name 查找 Person List<Person> findPeopleByName(String name); }创建测试类 RedisTest@RunWith(SpringRunner.class) @SpringBootTest public class RedisTest { @Autowired private PersonRepository personRepository; @Test public void savePerson() { // 创建两个 Person 实体 Person person1 = new Person("张三"); Person person2 = new Person("李四"); // 保存两个实体 Person save1 = personRepository.save(person1); Person save2 = personRepository.save(person2); // 输出保存对象 System.out.println(save1); System.out.println(save2); } @Test public void selectPerson() { // 查询名叫张三的 Redis 缓存 System.out.println(personRepository.findPeopleByName("张三")); } @Test public void updatePerson() { // 查询名叫 张三 的Redis 缓存对象 Person person = personRepository.findPeopleByName("张三").get(0); // 修改对象的名字 person.setName("ZhangSan"); // 保存修改后的对象 Person save = personRepository.save(person); System.out.println(save); } @Test public void deletePerson() { // 查找名叫李四的Person 对象, 确保一定存在 Person person = personRepository.findPeopleByName("李四").get(0); // 删除对象 personRepository.delete(person); try { // 尝试再次获取 李四对象 Person del = personRepository.findPeopleByName("李四").get(0); System.out.println(del); } catch (Exception e) { // 没找到则会报错 System.out.println("删除成功"); } } }执行结果savePersonupdatePersondeletePerson
2022年04月24日
43 阅读
0 评论
0 点赞