创建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是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);
}
}
我们直接基于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为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 是一个专门用于操作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是一个专门用于实现对远端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";
}
});
}
}
文章浏览阅读2.7k次,点赞2次,收藏5次。在c语言中,如果想要通过函数调用来改变值,有两种方式,第一种是通过指针的传递来改变值(这种可以一次改变多个变量的值),第二种是通过函数的返回值来传递值。第一种,中传递的时候其实只是地址的传递,相对第二种的值传递来说,第一种的效率要高不少,因为第一种传递的是地址,四个字节(部分计算机)大小的地址。特别,是在c中做字符串的处理时,这种第一种情况用的非常的多,我当时也是在做字符串处理的时候遇到这些问题,_跨函数调用
文章浏览阅读1k次。FFmpeg是非常流行的多媒体框架,主要用于音视频的解码、编码、转码、混流、过滤、播放等操作。2000年,法国著名的程序员Fabrice Bellard创建FFmpeg项目,前两个字母FF是Fast Forward的意思,同时他也发起MPlayer开源多媒体播放器项目。FFmpeg图标围绕FFmpeg后续将讲解FFmpeg的命令行操作,使用FFmpeg的API编写程序,深入源码进行分析等,本篇介绍..._h265 提取strm
文章浏览阅读1.1k次。我们在说 css 的核心基础的时候,介绍了三种选择器类型,分别是:class 选择器,id 选择器,标签选择器,但是啊,我们日常用到的肯定不止这些,我们这篇主要来说说一些除此之外的其他选择器,这个我们日后工作会常常用到~一、分组选择器先来说说分组选择器的由来,再说这个东西具体怎么用1. 由来我们知道啊,css 层叠样式由很多,但是在一个网页中,肯定有相同、或者说就是一模一样的样式,但是我们总不能一个一个去复制粘贴一遍,所以,为了我们更好的去定义css,我们需要一个选择器可以支持到我们做到这个_网页设计选择器类型介绍
文章浏览阅读84次。我正在开发一项功能,要求我获取网页的内容,然后检查该页面中是否存在某些文本.这是一个反向链接检查工具.问题是-函数在大多数情况下都能完美运行,但是有时,当链接明显位于该页面时,它会将页面标记为没有链接.我已经将其跟踪到视觉上比较输出中的字符串的程度,并且它们匹配得很好,但是使用==运算符,php告诉我它们不匹配.意识到这可能是某种编码问题,所以我决定看看如果在它们上使用base64_encode(...
文章浏览阅读523次。Linux下查看系统剩余空间1.查看系统整体空间剩余情况在命令行中输入“df -h”可以查看系统的分配,已使用和可用情况。如下图:2.查看每个文件夹的占用情况在命令行中输入 “du -sh *”可以查看每个文件夹的大小。此举可以快速定位大文件所存在的位置。..._kali查看剩余空间
文章浏览阅读1.9w次,点赞14次,收藏99次。empyreal生平empyrical是常用金融风险和表现度量。被zipline和pyfolio采用。三者都是quantopian开发维护。Github 官方文档API参考sortino_ratioempyrical.sortino_ratio(returns, required_return=0, period='daily', annualization=None, ..._empyrical库
文章浏览阅读890次。关于Matlab中rayleighchan这个函数的使用12-16各位大哥:关于Matlab中,现在有个rayleighchan这样的函数,它能产生瑞利衰落的信道,但是,其中的有个参数不是很理解,Help里面也没有讲清楚。它其中有个参数叫做:AvgPathGaindB-----average path gains;另外还有一个只读的参数是:PathGains。现在搞不清楚这两个参数之间是什么关系,..._matlab2020 无法调用rayleighchan
文章浏览阅读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
文章浏览阅读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. 中国科学院..._零知识证明技术的国内外研究现状
文章浏览阅读159次。集合jí hé[释义]①(动)许多分散的人或物聚在一起。民兵已经在村前~了。(作谓语)②(动)使集合。~各种材料;加以分析。(作谓语)[构成]动补式:集〈合[反义]分散、解散[同音]极核...仿写复习教案一、《语文课程标准》:根据语言情境的需要进行仿写、扩写、续写等,做到语言准确、连贯、流畅。其实仿写语句试题有一定的综合性,它往往涉及语法结构、表达方式、语意连贯、修辞运用、风格谐调等许多方面,也间..._java 小数乘法
文章浏览阅读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最多写几个