当前位置: 首页 > article >正文

Redis(5,jedis和spring)

在前面的学习中,只是学习了各种redis的操作,都是在redis命令行客户端操作的,手动执行的,更多的时候就是使用redis的api(),进一步操作redis程序。

在java中实现的redis客户端有很多,接下来我们将使用jedis,在maven仓库下载jedis。

在depency这里引入依赖。并且需要修改外网ip连接到云服务器并且开启6379端口。

不能开放6379端口因为容易被黑客入侵,所以我们需要配置ssh端口转发,把云服务器的redis端口映射到本地主机。

ssh端口转发的配置

相当于通过ssh的22来传递其他端口的数据,比如本身想要访问6379,我们就构造一个ssh的数据报,就要把访问redis请求放在数据报中,通过比较安全的22端口交给云服务器,服务器的程序就能解析该数据报然后交给6379端口。

但是这时候我们会在本地创建一个端口比如8888,映射6379这个端口,类似于在本地设立一个办事处,我们访问8888也就是访问Linux的6379(访问本地就是访问远程窗口)。

话不多说我们进行一个简单的配置,就可以把本地端口当成远程用。

打开属性,点击添加,在redis中进行如下配置,最后点击连接。

最后在cmd中输入netstat -ano | findstr 8888,查看是否连接好了。

接下来通过我们自己的127.0.0.1:8888就能操作redis了。

通过下列代码连接redis。

JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");

接着再从池子中获取连接,连接用完之后要记得关闭(close),此处的释放是把redis的连接放回池子中。

try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            System.out.println(jedis.ping());

        }

在这里我们之前配置好了redis.conf的配置项。

get和set方法:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;

public class RedisDemo {
    public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key1","222");
        SetParams setParams=new SetParams();
        setParams.ex(10);
        setParams.nx();
        jedis.set("key3","333",setParams);
        String key3 = jedis.get("key3");
        System.out.println(key3);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            test(jedis);

        }
    }
}

在这个test()方法中,通过set和get方法,创建和使用key,并且我们还可以给key设定setParams,可以设置其超时时间等。

exist和del:

public static void test2(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");
        boolean result = jedis.exists("key");
        System.out.println("result ="+result);
        long delnum = jedis.del("key2");
        System.out.println(delnum);
        


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            test2(jedis);

        }
    }

通过test2调用,来获取key数据书否存在,以及删除元素的操作,来删除以及存在的元素,返回的结果是删除的个数。

keys方法:

public static void test3(Jedis jedis){
        jedis.set("key","111");
        jedis.set("key1","111");
        jedis.set("key2","111");
        jedis.set("key3","111");
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            /*test2(jedis);*/
            test3(jedis);

        }
    }

在这里通过接受并且打印set的方式,在控制台打印set,并且这里的key没有顺序。

expire和ttl:

public static void test4(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.expire("key",10);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long time = jedis.ttl("key");
        System.out.println(time);


    }
    public static void main(String[] args) {
        //连接redis服务器上面,redis连接池。
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
            //接下来的命令就对应到redis的客户端操作了
            /*System.out.println(jedis.ping());*/
            /*test1(jedis);*/
            /*test2(jedis);*/
//            test3(jedis);
            test4(jedis);

        }
    }

通过expire设置过期时间,以及通过ttl查看过期时间还剩下多少。

type:

public static void test5(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        String type = jedis.type("key");
        System.out.println(type);

    }

通过如上方法打印type的类型到控制台,由于没有过多设置这里默认是String类型。

mset和mget方法:

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.mset("key","000","key1","111","key2","222","key3","333");
        List<String> list = jedis.mget("key", "key1", "key2");
        System.out.println(list);


    }

如果在mgetde过程中查询了一个不存在的key就会出现null的情况。

setrange和getrange方法:

public static void test1(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","asdfghjkl");
        String string = jedis.getrange("key", 2, 5);
        System.out.println(string);
        jedis.setrange("key",2,"asasa");
        String string1 = jedis.get("key");
        System.out.println(string1);
    }

getrange获取指定区间的元素,setrange从指定位置开始修改元素。

append:

对key进行字符串拼接。

public static void test2(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","111");
        jedis.append("key","asdfghjkl");
        String key = jedis.get("key");
        System.out.println(key);

    }

incr和decr:

public static void test3(Jedis jedis){
        jedis.flushAll();
        jedis.set("key","100");
        long key = jedis.incr("key");
        System.out.println(key);
        long key1 = jedis.decr("key");
        System.out.println(key1);


    }

通过incr和decr来对指定的key中的数字加减。

list相关lpush,lrange等操作

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.lpush("key","111","222","333");
        List<String> list = jedis.lrange("key", 0, -1);
        System.out.println(list);


    }

头插法进行对头部插入。 

集合类型(sadd和smembers):

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.sadd("key","111","222","333","444","555");
        Set<String> set = jedis.smembers("key");
        System.out.println(set);
        boolean result = jedis.sismember("key", "111");
        System.out.println(result);


    }

哈希类型的使用

public static void test1(Jedis jedis){
        jedis.flushAll();
        Map<String,String> field=new HashMap<>();
        field.put("f1","111");
        field.put("f2","222");
        jedis.hset("key",field);
        String hget = jedis.hget("key", "f1");
        System.out.println(hget);


    }

先构造一个哈希类型的field,并且通过jedis来放置field。

Zset有序集合:

public static void test(Jedis jedis){
        jedis.flushAll();
        jedis.zadd("key",10,"lisi");
        Map<String,Double> map=new HashMap<>();
        map.put("zhangsan",20.0);
        map.put("lisi",15.0);
        jedis.zadd("key",map);
        List<Tuple> key = jedis.zrangeWithScores("key", 0, -1);
        System.out.println(key);
        System.out.println(key.get(0).getScore());
        System.out.println(key.get(0).getElement());


    }

在spring中配置redis

首先要在yml文件中配置以下配置。

spring:
  data:
    redis:
      port: 8888
      host: 127.0.0.1

接着在xml文件中导入操作redis的依赖。

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

在controller中注入 StringRedisTemplate,在java中我们是直接使用jedis来操作redis,但是在spring中使用StringRedisTemplate,是专门处理文本数据的。

    @Autowired
    StringRedisTemplate stringRedisTemplate;

在StringRedisTemplate中做了进一步的封装,可以得到专门操作某个数据结构的对象,比如获得专门操作哈希的对象。

String(Spring版本)

 通过ops的方法来操作相应的对象。

 @Resource
    private StringRedisTemplate stringRedisTemplate;


    @RequestMapping("/test")
    public String test(){
        stringRedisTemplate.getConnectionFactory().getConnection().flushAll();

        stringRedisTemplate.opsForValue().set("key1","111");
        stringRedisTemplate.opsForValue().set("key2","222");
        stringRedisTemplate.opsForValue().set("key3","333");

        String string = stringRedisTemplate.opsForValue().get("key1");
        System.out.println(string);
        return "ok";


    }

执行redis原生命令(excute):

 redis留了一个后手,能让我们随时执行redis原生命令。

stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });

通过execute方法和lambda表达式来构建connection方法来调用flush方法,就能够做到类似于在控制台上面操作程序。

List(Spring版本)

public String testList(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForList().leftPush("key","111");
        String string = stringRedisTemplate.opsForList().rightPop("key");
        System.out.println(string);
        return "ok";

    }

Set(Spring版本):

public String testSet(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForSet().add("key","111","222","333");
        Set<String> key = stringRedisTemplate.opsForSet().members("key");
        System.out.println(key);

        Boolean isexist=stringRedisTemplate.opsForSet().isMember("key","111");
        System.out.println(isexist);
        return "ok";



    }

Set操作和前面的List和String操作也很相似。这里我们就快速学习一下。

Hash(Spring版本)

public String testHash(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForHash().put("key","f1","111");
        stringRedisTemplate.opsForHash().put("key","f2","222");
        stringRedisTemplate.opsForHash().put("key","f3","333");

        String value = (String) stringRedisTemplate.opsForHash().get("key", "f1");
        System.out.println(value);

        Boolean exist = stringRedisTemplate.opsForHash().hasKey("key", "f1");

        Long l = stringRedisTemplate.opsForHash().size("key");
        System.out.println(l);

        return "ok";

    }

public String testZSet(){
        stringRedisTemplate.execute((RedisConnection connection)->{
            connection.flushAll();
            return null;
        });
        stringRedisTemplate.opsForZSet().add("key","zhangsan",10);
        stringRedisTemplate.opsForZSet().add("key","lisi",20);
        stringRedisTemplate.opsForZSet().add("key","wangwu",30);
        Set<String> key = stringRedisTemplate.opsForZSet().range("key", 0, -1);
        System.out.println(key);
        Set<ZSetOperations.TypedTuple<String>> key1 = stringRedisTemplate.opsForZSet().rangeWithScores("key", 0, -1);
        System.out.println(key1);
        return "ok";


    }


http://www.kler.cn/a/518254.html

相关文章:

  • vue3 vue2区别
  • Java数据结构方面的面试试题以及答案解析
  • Angular 2 表单深度解析
  • vscode如何安装vue语法支持
  • 量子编程语言:Qiskit 与 Cirq
  • Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴
  • QModbusTCPClient 服务器断开引起的程序崩溃
  • ChirpIoT技术的优势以及局限性
  • Spring Boot - 数据库集成03 - 集成Mybatis
  • SSM框架探秘:Spring 整合 Mybatis 框架
  • Linux(Centos 7.6)命令详解:wc
  • linux查看上次开机时间
  • Effective C++ 规则46: 需要类型转换时,请为模板定义非成员函数
  • LVGL+FreeRTOS实战项目:智能健康助手(xgzp6847a篇)
  • 【算法工程】VS Code问题解决:Failed to parse remote port from server output
  • Java多线程的面试面试题及答案解析
  • Golang之Context详解
  • 【pytorch 】miniconda python3.11 环境安装pytorch
  • 无公网IP 外网访问媒体服务器 Emby
  • GS论文阅读--GeoTexDensifier
  • 如何实现分页相关功能
  • 比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)
  • Lambda 表达式
  • 笔记《Effective Java》01: 创建和销毁对象
  • 软件测试丨消息管道(Kafka)测试体系
  • 电路研究9.2.1——合宙Air780EP音频的AT控制指令