Jedis 和 Redis Template 应用_jedis.hval redistemplate-程序员宅基地

技术标签: Redis学习  java  数据库  redis  

准备工作

创建工程

创建maven父工程,例如03-sca-redis,并在此工程下创建两个子工程,一个为sca-jedis,一个为sca-tempate,例如:

添加项目依赖

sca-jedis 工程依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.5.2</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

添加sca-template工程依赖

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Jedis的应用

简介

Jedis是Java中操作redis的一个客户端,类似通过jdbc访问mysql数据库。

准备工作

第一步:从redis.io官方下载对应版本的redis.conf文件,地址如下:

https://redis.io/topics/config/

第二步:停止redis并删除挂载目录下(/usr/local/docker/redis01/conf)的redis.conf配置文件.
第三步:将下载的redis.conf文件拷贝到redis挂载目录(/usr/local/docker/redis01/conf)
第四步:基于vim打开redis.conf文件,然后注释 bind 127.0.0.1这一行,并修改protected-mode的值修改为no.
第五步:重启redis服务,并检查启动日志(docker logs 容器id)

快速入门实现

在Jedis工程中定义单元测试类,在类中定义单元测试方法:

基础类型操作

在项目的src/test/java目录创建单元测类,例如:

package jedis;

import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class JedisTests {
    

    // 点赞成员, 特点: 无序, 不可重复
    @Test
    public void testSetOperation(){
    
        Jedis jedis=new Jedis("192.168.126.128",6379);
        jedis.sadd("set1", "A", "B", "B", "C");
        jedis.srem("set1", "A");
        Set<String> set1 = jedis.smembers("set1");
        System.out.println(set1);
        jedis.close();
    }

    //list类型练习:实现一个阻塞队列
    @Test
    public void testListOperation2(){
    
        //1.建立连接
        Jedis jedis=new Jedis("192.168.126.128",6379);
        // create
        jedis.lpush("list02", "A","B","C","D");
        // 取
        jedis.brpop(5,"list02");
        jedis.brpop(5,"list02");
        jedis.brpop(5,"list02");
        jedis.brpop(5,"list02"); // 当队列中没有数据时, 回阻塞当前线程
        // 阻塞式队列放入四循环中, 防止cup空转, 消耗系统资源,
        // retrieve
        String rpop = jedis.rpop("list02");
        System.out.println(rpop);

    }

    //list类型练习:实现一个秒杀队列
    @Test
    public void testListOperation1(){
    
        //1.建立连接
        Jedis jedis=new Jedis("192.168.126.128",6379);
        // create
        jedis.lpush("list01", "A","B","C","C");
        // update
//        String e = jedis.lindex("list01", 0);
//        System.out.println(e);
        jedis.lset("list01", jedis.lpos("list01", "A"), "D");
        // retrieve
        String rpop = jedis.rpop("list01");
        System.out.println(rpop);

    }

    //hash类型练习(直接存储map对象)
    @Test
    public void testHashOperation2(){
    
        //1.建立连接
        Jedis jedis=new Jedis("192.168.126.129",6379);
        //2.存储
        Map<String,String> map=new HashMap<>();
        map.put("x","100");
        map.put("y","200");
        jedis.hset("point",map);
        //3.获取博客内容并输出
        map=jedis.hgetAll("point");
        System.out.println(map);
        //4.释放资源
        jedis.close();
    }

    //hash类型练习
    @Test
    public void testHashOperation1(){
    
        //1.建立连接
        Jedis jedis = new Jedis("192.168.126.128", 6379);
        //2.存储一篇博客信息
        jedis.hset("article","id","1");
        jedis.hset("article","title","mybatis");
        jedis.hset("article","content","framework");
        //3.获取博客内容并输出
        String id=jedis.hget("article","id");
        String title=jedis.hget("article","title");
        String content= jedis.hget("article","content");
        System.out.println(id+"/"+title+"/"+content);
        //4.释放资源
        jedis.close();
    }

    // json数据练习
    @Test
    public void testStringOperation2(){
    
        Jedis jedis = new Jedis("192.168.126.128", 6379);

        Map<String, Object> map = new HashMap<>();
        map.put("id", 1);
        map.put("name", "jack");
        map.put("password", "123456");

        Gson gson = new Gson();
        String json = gson.toJson(map);
        System.out.println(json);

        jedis.set("user", json);
        String user = jedis.get("user");
        System.out.println(user);
        Map<String, Object> obj = gson.fromJson(user, Map.class);
        System.out.println(obj);
        jedis.close();

    }

    // 字符串类型练习
    @Test
    public void testStringOperation1() throws InterruptedException {
    
        Jedis jedis = new Jedis("192.168.126.128", 6379);
        jedis.set("id", "1000");
        jedis.set("count", "500");
        jedis.set("content", "redis");

        jedis.incr("id");
        jedis.expire("count", 1);

        String id = jedis.get("id");// 1001
//        Thread.sleep(1000);
        TimeUnit.SECONDS.sleep(1);
        String count = jedis.get("count");
        String format = String.format("id=%s,count=%s", id, count);
        System.out.println(format);

    }

    // redis连接测试
    @Test
    public void testConnect(){
    
        Jedis jedis = new Jedis("192.168.126.128", 6379);
//        jedis.connect();
        String ping = jedis.ping();
        System.out.println(ping);
    }
}

连接池JedisPool应用

我们直接基于Jedis访问redis时,每次获取连接,释放连接会带来很大的性能开销,可以借助Jedis连接池,重用创建好的连接,来提高其性能,简易应用方式如下:

package com.jt;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolTests {
    
    @Test
   public void testJedisPool(){
    
        //定义连接池的配置
        JedisPoolConfig config=new JedisPoolConfig();
        config.setMaxTotal(1000);//最大连接数
        config.setMaxIdle(60);//最大空闲时间(连接不用了要释放)
        //创建连接池
        JedisPool jedisPool=
        new JedisPool(config,"192.168.126.130",6379);
        //从池中获取一个连接
        Jedis resource = jedisPool.getResource();
        resource.auth("123456");
        //通过jedis连接存取数据
        resource.set("class","cgb2004");
        String clazz=resource.get("class");
        System.out.println(clazz);
        //将链接返回池中
        resource.close();
        //关闭连接池
        jedisPool.close();
    }
}

RedisTemplate应用

简介

RedisTemplate为SpringBoot工程中操作redis数据库的一个Java对象,此对象封装了对redis的一些基本操作。

准备工作

第一步:创建工程配置文件application.yml,其内容如下:

spring:
  redis:
    host: 192.168.64.128  #远程redis服务器ip地址
    port: 6379

第二步:创建工程启动类,例如:

package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RedisApplication {
    
    public static void main(String[] args) {
    
        SpringApplication.run(RedisApplication.class,args);
    }
}

快速入门实现

StringRedisTemplate 应用

StringRedisTemplate 是一个专门用于操作redis字符串类型数据的一个对象,其应用方式如下:

package com.jt.redis;
@SpringBootTest
public class StringRedisTemplateTests {
    
    /**此对象为spring提供的一个用于操作redis数据库中的字符串的一个对象*/
  @Autowired
  private StringRedisTemplate stringRedisTemplate;
  
  @Test
  void testConnection(){
    
        RedisConnection connection =
                stringRedisTemplate.getConnectionFactory()
                        .getConnection();
        String ping = connection.ping();
        System.out.println(ping);
    }

  @Test
  void testRedisStringOper()throws Exception{
    
  	
    //获取用于操作字符串的值对象
   	ValueOperations<String, String> valueOperations
            = stringRedisTemplate.opsForValue();
   	//向redis中存储数据
   	valueOperations.set("ip", "192.168.174.128");
   	valueOperations.set("state","1",1, TimeUnit.SECONDS);
   	valueOperations.decrement("state");
   	// Thread.sleep(2000);
   	//从redis中取数据
   	String ip=valueOperations.get("ip");
   	System.out.println("ip="+ip);
   	String state=valueOperations.get("state");
   	System.out.println("state="+state);
  	}
}

RedisTemplate 应用

RedisTemplate是一个专门用于实现对远端redis中复杂数据的操作的对应,应用案例如下:

package com.jt.redis;
@SpringBootTest
public class RedisTemplateTests {
    
    /**
     * 通过此对象操作redis中复杂数据类型的数据,例如hash结构
     */
    @Autowired
    private RedisTemplate redisTemplate;

  @Test
    void testConnection(){
    
        String result=
        redisTemplate.getConnectionFactory().getConnection().ping();
        System.out.println(result);
    }

    @Test
    void testSetData(){
    
        SetOperations setOperations=redisTemplate.opsForSet();
        setOperations.add("setKey1", "A","B","C","C");
        Object members=setOperations.members("setKey1");
        System.out.println("setKeys="+members);
        //........
    }

    @Test
    void testListData(){
    
      //向list集合放数据
        ListOperations listOperations = redisTemplate.opsForList();
        listOperations.leftPush("lstKey1", "100"); //lpush
        listOperations.leftPushAll("lstKey1", "200","300");
        listOperations.leftPush("lstKey1", "100", "105");
        listOperations.rightPush("lstKey1", "700");
        Object value= listOperations.range("lstKey1", 0, -1);
        System.out.println(value);
      //从list集合取数据
        Object v1=listOperations.leftPop("lstKey1");//lpop
        System.out.println("left.pop.0="+v1);
        value= listOperations.range("lstKey1", 0, -1);
        System.out.println(value);
    }

    /**通过此方法操作redis中的hash数据*/
    @Test
    void testHashData(){
    
        HashOperations hashOperations = redisTemplate.opsForHash();//hash
        Map<String,String> blog=new HashMap<>();
        blog.put("id", "1");
        blog.put("title", "hello redis");
        hashOperations.putAll("blog", blog);
        hashOperations.put("blog", "content", "redis is very good");
        Object hv=hashOperations.get("blog","id");
        System.out.println(hv);
        Object entries=hashOperations.entries("blog");
        System.out.println("entries="+entries);
    }

   @Test
    void testFlushdb(){
    
        redisTemplate.execute(new RedisCallback() {
    
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
    
               //redisConnection.flushDb();
                redisConnection.flushAll();
                return "flush ok";
            }
        });
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51699648/article/details/120150807

智能推荐

c深入剖析跨函数调用指针(多级指针)问题-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏5次。在c语言中,如果想要通过函数调用来改变值,有两种方式,第一种是通过指针的传递来改变值(这种可以一次改变多个变量的值),第二种是通过函数的返回值来传递值。第一种,中传递的时候其实只是地址的传递,相对第二种的值传递来说,第一种的效率要高不少,因为第一种传递的是地址,四个字节(部分计算机)大小的地址。特别,是在c中做字符串的处理时,这种第一种情况用的非常的多,我当时也是在做字符串处理的时候遇到这些问题,_跨函数调用

ffmpeg mp4 提取h265命令行_安装FFmpeg多媒体库,以及命令行程序使用介绍-程序员宅基地

文章浏览阅读1k次。FFmpeg是非常流行的多媒体框架,主要用于音视频的解码、编码、转码、混流、过滤、播放等操作。2000年,法国著名的程序员Fabrice Bellard创建FFmpeg项目,前两个字母FF是Fast Forward的意思,同时他也发起MPlayer开源多媒体播放器项目。FFmpeg图标围绕FFmpeg后续将讲解FFmpeg的命令行操作,使用FFmpeg的API编写程序,深入源码进行分析等,本篇介绍..._h265 提取strm

Web网页设计之css_4. css 其他选择器_网页设计选择器类型介绍-程序员宅基地

文章浏览阅读1.1k次。我们在说 css 的核心基础的时候,介绍了三种选择器类型,分别是:class 选择器,id 选择器,标签选择器,但是啊,我们日常用到的肯定不止这些,我们这篇主要来说说一些除此之外的其他选择器,这个我们日后工作会常常用到~一、分组选择器先来说说分组选择器的由来,再说这个东西具体怎么用1. 由来我们知道啊,css 层叠样式由很多,但是在一个网页中,肯定有相同、或者说就是一模一样的样式,但是我们总不能一个一个去复制粘贴一遍,所以,为了我们更好的去定义css,我们需要一个选择器可以支持到我们做到这个_网页设计选择器类型介绍

php中统一编码语句,在PHP中比较字符串之前,使编码统一-程序员宅基地

文章浏览阅读84次。我正在开发一项功能,要求我获取网页的内容,然后检查该页面中是否存在某些文本.这是一个反向链接检查工具.问题是-函数在大多数情况下都能完美运行,但是有时,当链接明显位于该页面时,它会将页面标记为没有链接.我已经将其跟踪到视觉上比较输出中的字符串的程度,并且它们匹配得很好,但是使用==运算符,php告诉我它们不匹配.意识到这可能是某种编码问题,所以我决定看看如果在它们上使用base64_encode(...

Linux学习之路(二)查看系统剩余空间_kali查看剩余空间-程序员宅基地

文章浏览阅读523次。Linux下查看系统剩余空间1.查看系统整体空间剩余情况在命令行中输入“df -h”可以查看系统的分配,已使用和可用情况。如下图:2.查看每个文件夹的占用情况在命令行中输入 “du -sh *”可以查看每个文件夹的大小。此举可以快速定位大文件所存在的位置。..._kali查看剩余空间

金融评测指标empyrical库详解Sortino、calmar、omega、sharpe、annual_return、max_drawdown-程序员宅基地

文章浏览阅读1.9w次,点赞14次,收藏99次。empyreal生平empyrical是常用金融风险和表现度量。被zipline和pyfolio采用。三者都是quantopian开发维护。Github 官方文档API参考sortino_ratioempyrical.sortino_ratio(returns, required_return=0, period='daily', annualization=None, ..._empyrical库

随便推点

matlab filter rayleighchan,关于Matlab中rayleighchan这个函数的使用-程序员宅基地

文章浏览阅读890次。关于Matlab中rayleighchan这个函数的使用12-16各位大哥:关于Matlab中,现在有个rayleighchan这样的函数,它能产生瑞利衰落的信道,但是,其中的有个参数不是很理解,Help里面也没有讲清楚。它其中有个参数叫做:AvgPathGaindB-----average path gains;另外还有一个只读的参数是:PathGains。现在搞不清楚这两个参数之间是什么关系,..._matlab2020 无法调用rayleighchan

ABAP 创建设备BAPI BAPI_EQUI_CREATE-程序员宅基地

文章浏览阅读996次。DATA: EXT_NUMBER TYPE BAPI_ITOB_PARMS-EQUIPMENT. DATA: DATA_GENERAL TYPE BAPI_ITOB. DATA: DATA_GENERAL_EXP TYPE BAPI_ITOB. DATA: DATA_SPECIFIC TYPE BAPI_ITOB_EQ_ONLY. DATA: DATA_INSTALL TYPE BAPI_ITOB_EQ_INSTALL. DATA: RETURN TYPE B._bapi_equi_create

1042 字符统计-程序员宅基地

文章浏览阅读67次。请编写程序,找出一段给定文字中出现最频繁的那个英文字母。输入格式:输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。输出格式:在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。输入样例:This is a simple TEST. There ARE numbers and oth

零知识证明应用到区块链中的技术挑战-程序员宅基地

文章浏览阅读1.3k次。零知识证明应用到区块链中的技术挑战李康1,2, 孙毅1,2, 张珺3, 李军4, 周继华5, 李忠诚11. 中国科学院计算技术研究所,北京 100190 2. 中国科学院..._零知识证明技术的国内外研究现状

java 小数乘法_集合复习教案-程序员宅基地

文章浏览阅读159次。集合jí hé[释义]①(动)许多分散的人或物聚在一起。民兵已经在村前~了。(作谓语)②(动)使集合。~各种材料;加以分析。(作谓语)[构成]动补式:集〈合[反义]分散、解散[同音]极核...仿写复习教案一、《语文课程标准》:根据语言情境的需要进行仿写、扩写、续写等,做到语言准确、连贯、流畅。其实仿写语句试题有一定的综合性,它往往涉及语法结构、表达方式、语意连贯、修辞运用、风格谐调等许多方面,也间..._java 小数乘法

v-if多个条件判断语句_v-else-if最多写几个-程序员宅基地

文章浏览阅读4.4w次。v-if多个条件判断语句还有条件则继续增加v-else-if// 我这里是三个条件,如果还有条件则继续增加 v-else-if <div v-if="item.enable === '已签到'"> <span class="badge badge-success">{{ item.enable }}</span> </div> <..._v-else-if最多写几个

推荐文章

热门文章

相关标签