前言

在之前的文章中,讲解了使用redis解决集群环境session共享的问题【快学springboot】11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过springboot的配置,实现了session共享。下面,我们就通过springboot提供的RedisTemplate来操作redis。

注入RedisTemplate

  1. @Autowired
  2. private StringRedisTemplate redisTemplate;

这里我注入了一个StringRedisTemplate,其等价于RedisTemplate<String,String>,我们也可以自定义一个RedisTemplate,如下:

  1. @Configuration
  2. public class RedisTemplateConfig {

  3. @Bean
  4. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  5. RedisTemplate<String, Object> template = new RedisTemplate<>();
  6. // 配置连接工厂
  7. template.setConnectionFactory(factory);
  8. return template;
  9. }

  10. }

本人觉得,完全没有必要自定义一个RedisTemplate,除非说有一些序列化上的需求。本文的讲解都是基于默认的StringRedisTemplate的。

设置/获取值

我们可以通过opsForValue().set(k,v)方法设置一个值opsForValue().get(k)方法获取值

  1. @Test
  2. public void testsetAndGetString() {
  3. redisTemplate.opsForValue().set("name", "happyjava");
  4. String name = redisTemplate.opsForValue().get("name");
  5. System.out.println(name);
  6. }

执行结果:

查看redis数据库上的值,如下:

设置值并且同时设置过期时间

opsForValue().set方法还支持同时设置键对应的过期时间

  1. @Test
  2. public void testSetWithExpireTime() {
  3. redisTemplate.opsForValue().set("name2", "happyjava2", 10, TimeUnit.SECONDS);
  4. String name2 = redisTemplate.opsForValue().get("name2");
  5. System.out.println(name2);
  6. }

执行结果:

  1. happyjava2

获取键的过期时间

我们可以通过redisTemplate.getExpire方法获得键的过期时间

  1. @Test
  2. public void testSetWithExpireTime() {
  3. redisTemplate.opsForValue().set("name2", "happyjava2", 10, TimeUnit.SECONDS);
  4. String name2 = redisTemplate.opsForValue().get("name2");
  5. System.out.println(name2);
  6. Long expire = redisTemplate.getExpire("name2", TimeUnit.SECONDS);
  7. System.out.println(expire);
  8. }

执行结果如下:

  1. happyjava2
  2. 9

设置键的过期时间

我们可以通过redisTemplate.expire方法设置键的过期时间

  1. @Test
  2. public void testSetExpire() {
  3. redisTemplate.expire("name",120,TimeUnit.SECONDS);
  4. Long expire = redisTemplate.getExpire("name", TimeUnit.SECONDS);
  5. System.out.println(expire);
  6. }

之前设置了name是非过期的,这里给它设置个过期时间。执行结果如下:

  1. 119

getAndSet

我们可以通过opsForValue().getAndSet方法获取此时的值,然后设置一个新的值。

  1. @Test
  2. public void test() {
  3. redisTemplate.opsForValue().set("name", "123456");
  4. String name = redisTemplate.opsForValue().getAndSet("name", "happyjava3");
  5. System.out.println(name);
  6. name = redisTemplate.opsForValue().get("name");
  7. System.out.println(name);
  8. }

输出结果如下:

  1. 123456
  2. happyjava3

append追加

通过redisTemplate.opsForValue().append方法可以追加内容。

  1. @Test
  2. public void test() {
  3. redisTemplate.opsForValue().append("name","append");
  4. String name = redisTemplate.opsForValue().get("name");
  5. System.out.println(name);
  6. }

这里向之前的name键追加了一个字符串“append”,输出结果如下:

  1. happyjava3append

自增

自增是redis里非常常用的方法,常常用该方法来实现计数器。我们可以通过redisTemplate.opsForValue().increment方法实现自增

  1. @Test
  2. public void test() {
  3. Long count = redisTemplate.opsForValue().increment("count");
  4. System.out.println(count);
  5. Long count1 = redisTemplate.opsForValue().increment("count", 11);
  6. System.out.println(count1);
  7. }

如果键不存在,则会默认从0开始自增,我们也可以设置自增的值的大小。

自减

我们可以通过redisTemplate.opsForValue().decrement方法来实现自减

  1. @Test
  2. public void test() {
  3. Long count = redisTemplate.opsForValue().decrement("count");
  4. System.out.println(count);
  5. Long count1 = redisTemplate.opsForValue().decrement("count", 10);
  6. System.out.println(count1);
  7. }

如果存在则设置/如果不存在则设置

setIfAbsent:如果不存在,则设置。

并且可以通过重载的方法设置过期时间,这个方法是很重要的,可以基于该方法实现一个分布式锁。

setIfPresent:如果存在,则设置。

  1. @Test
  2. public void test() {
  3. Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("name", "happy");
  4. System.out.println(aBoolean);
  5. Boolean aBoolean1 = redisTemplate.opsForValue().setIfPresent("name", "happy2");
  6. System.out.println(aBoolean1);
  7. }

因为之前已经存在name的值,该代码的预期输出结果是false true。

总结

这里介绍了redis string数据结构的常用操作。接下来的会对其它的数据结构做进一步讲解。

【快学springboot】13.操作redis之String数据结构的更多相关文章

  1. 【快学springboot】14.操作redis之list

    前言 之前讲解了springboot(StringRedisTemplate)操作redis的string数据结构,这篇文章将会讲解list数据结构 list数据结构具有的操作 下图列出了redis ...

  2. 【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案

    前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的. ...

  3. 【快学springboot】8.JPA乐观锁OptimisticLocking

    介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰 ...

  4. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  5. 【快学springboot】12.实现拦截器

    前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了Web ...

  6. 【快学springboot】4.接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  7. PHP操作redis之String(字符串)、List(列表)(一)

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key – value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  8. 【快学springboot】11.整合redis实现session共享

    前言 这里都是基于前面的项目基础上的.springboot整合redis非常的方便,这也是springboot的宗旨,简化配置.这篇文章就教大家如何使用springboot整合redis来实现sess ...

  9. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

随机推荐

  1. PHPExcel 导出图片

    $objDrawing = new PHPExcel_Worksheet_Drawing(); // 本地图片文件路径 $objDrawing->setPath('/www/images/img ...

  2. 解决Zookeeper无法启动的问题

    在启动zookeeper集群的单个zookeeper节点时总是报如下错误 [root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh status JMX e ...

  3. rapidxml编写xml文件(er)

    一.以rapidxml::node_declaration形式写xml文件第一行 int write(void) { ; rapidxml::xml_document<> doc; rap ...

  4. JS-this的使用

    做前端开发已经半年之多了,前几天看见apply时心生疑惑,于是查阅了好多资料但还是不太理解,只知道是源于this的问题,今天偶然看到了阮一峰大佬的讲解js中的this问题(http://www.rua ...

  5. 解决安装 fireworks、photoshop 时卡在输入账号、手机号处等问题

    一定要断网! 一定要断网! 一定要断网! 重要的事情说三遍! 我安装的是破解版CS6系列: 安装步骤如下: 1.当进行安装到此步时,(前面的步骤为解压文件等便不解释),选择“试用”,此时应该是 断网  ...

  6. 如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

    这篇博文主要针对浏览器中绘制椭圆的方法扩展.在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷.其中有压缩法,计算法,贝塞尔曲线法等多种方式.但是都不能很好的绘制出椭圆.所有我就对这个绘制椭圆的方式进行 ...

  7. uniGUI之UniPopupMenu和右键菜单(27)

    0]MainModule的BrowserOptions.boDisableMouseRightClick设置为Trure; 1]控件的OnCellContextClick的事件 procedure T ...

  8. java月利率计算(等额本息贷款)

    等额本息 每月还款计算公式: 每月本息金额 = (本金×月利率×(1+月利率)^还款月数)÷ ((1+月利率)^还款月数-1)) 反转求出 月利率 月利率 如果根据上面公式反转是算不出来的. 下面给出 ...

  9. ES6-使用模板字符串完成字符串拼接

        var obj = {name:'tom',age:11};     //es5的字符串拼接比较麻烦     var str = '姓名是:'+obj.name+' '+'年龄是:'+obj. ...

  10. Update(Stage4):Structured Streaming_介绍_案例

    1. 回顾和展望 1.1. Spark 编程模型的进化过程 1.2. Spark 的 序列化 的进化过程 1.3. Spark Streaming 和 Structured Streaming 2. ...