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

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: 8888host: 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,是专门处理文本数据的。

    @AutowiredStringRedisTemplate stringRedisTemplate;

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

String(Spring版本)

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

 @Resourceprivate 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.lryc.cn/news/525917.html

相关文章:

  • Git 小白入门教程
  • Python从0到100(八十五):神经网络与迁移学习在猫狗分类中的应用
  • 代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)
  • C++ 复习总结记录九
  • 数据库性能优化(sql优化)_SQL执行计划02_yxy
  • Vivado生成X1或X4位宽mcs文件并固化到flash
  • 在K8S中使用Values文件定制不同环境下的应用配置详解
  • 边缘网关具备哪些功能?
  • ThinkPHP 8 操作JSON数据
  • 环境变量配置与问题解决
  • pytorch2.5实例教程
  • 【开源免费】基于SpringBoot+Vue.JS智慧图书管理系统(JAVA毕业设计)
  • 基于自然语言处理的垃圾短信识别系统
  • Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
  • Day 17 卡玛笔记
  • 深圳大学-智能网络与计算-实验一:RFID原理与读写操作
  • ⚡C++ 中 std::transform 函数深度解析:解锁容器元素转换的奥秘⚡【AI 润色】
  • 【miniconda】:langraph的windows构建
  • (k8s)k8s部署mysql与redis(无坑版)
  • Git常用操作指令
  • 新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景
  • 智能安全策略-DPL
  • 差分进化算法 (Differential Evolution) 算法详解及案例分析
  • Alibaba Spring Cloud 十七 Sentinel熔断降级
  • LetsWave脑电数据简单ERP分析matlab(一)
  • 设计模式Python版 工厂方法模式
  • 贝叶斯优化相关
  • 【Matlab高端绘图SCI绘图全家桶更新版】在原60种绘图类型基础上更新
  • 如何构建一个 GraphRAG 系统
  • 代码随想录算法训练营day34