<!--jedis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
@Test
public void quickTest() throws Exception {
// 参数一:redis服务器ip
// 参数二:redis服务器的端口号
Jedis jedis = new Jedis("192.168.27.132", 6379);
String name = jedis.set("name", "zhangsan");
System.out.println("name = " + name);
String value = jedis.get("name");
System.out.println("value = " + value);
}
@Test
public void JedisPoolTestDemo() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
String host = "192.168.27.132";
int port = 6379;
int timeout = 5000;
//产生连接池对象
JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout);
Jedis jedis = jedisPool.getResource();
jedis.set("name","张三");
jedis.set("name1","张三1");
jedis.set("name2","张三2");
jedis.hset("person","name","李四");
jedis.hset("person","name1","李四1");
jedis.hset("person","name2","李四2");
System.out.println(jedis.get("name"));
System.out.println(jedis.get("name1"));
System.out.println(jedis.get("name2"));
Map<String, String> person = jedis.hgetAll("person");
System.out.println("person = " + person);
//关闭后归还到连接池
jedis.close();
}
public class JedisPoolUtils {
private static JedisPool jedisPool = null;
private static final String HOST = "192.168.27.132";
private static final int PORT = 6379;
private static final int TIMEOUT = 3000;
static {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
jedisPool = new JedisPool(poolConfig,HOST,PORT,TIMEOUT);
}
public static Jedis getResource() {
return jedisPool.getResource();
}
}
Jedis jedis = JedisPoolUtils.getResource(); //在连接池中获取jedis连接对象
String name = jedis.get("name");
System.out.println("name = " + name);
jedis.close();//关闭并归还连接
思路:将创建好的对象转成json格式字符串,存储到redis中
//创建对象
Device device = new Device();
device.setId(1);
device.setDeviceName("挖掘机");
device.setPrice(30000D);
//json转换
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(device);
//获取jedis对象
Jedis jedis = JedisPoolUtils.getResource();
//存储对象
jedis.set("device:" + device.getId(), json);
String deviceString = jedis.get("device:" + device.getId());
System.out.println("deviceString = " + deviceString);
//归还连接到连接池
jedis.close();
思路:
将创建好的对象序列化为字节数组,存储到redis中
从redis中获取字节数组,并将字节数组反序列化为对象
//创建对象
Device device = new Device();
device.setId(1);
device.setDeviceName("挖掘机");
device.setPrice(30000D);
//获取jedis对象
Jedis jedis = JedisPoolUtils.getResource();
//对象转换为字节数组,使用SerializationUtils的serialize()方法
byte[] key = ("device:" + device.getId()).getBytes();
byte[] value = SerializationUtils.serialize(device);
//存储字节
jedis.set(key, value);
//获取key对应的value
byte[] bytes = jedis.get(key);
//SerializationUtils的deserialize()方法 将字节转为对象
Device device1 = (Device) SerializationUtils.deserialize(bytes);
System.out.println(device1);
//归还连接到连接池
jedis.close();
当我们有10000条数据要存储到redis中,使用原始方式存:
@Test
public void tenThousandTest(){
Jedis jedis = JedisPoolUtils.getResource();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
jedis.set("i:"+i,"v:"+i);
}
System.out.println(System.currentTimeMillis()-start);//大概4秒
jedis.close();
}
当执行完之后得到时间差,发现用时大概4秒。
使用过查看redis性能命令的小伙伴会发现读写的性能能达到100000次/s
据官方的bench-mark数据:读的速度是110000次/s,写的速度是81000次/s
#redis写的性能
redis-benchmark set
#redis读的性能
redis-benchmark get
其实不然,我们仔细想一下,我们的jedis程序和redis服务器是在不同服务器上,
那Jedis的数据要保存到redis中就要通过网络传输
对于上面代码而言,每写一个就要传一个到redis中,一共要发送10000次,这之间消耗的时间是比较久的,也就对代码执行完之后计算得出的时间产生了影响。
有,Jedis提供了一个pipelined(),也就是管道操作,我们来看升级后的代码
@Test
public void test(){
Jedis jedis = JedisPoolUtils.getResource();
Long start = System.currentTimeMillis();
Pipeline pipelined = jedis.pipelined();
for (int i = 0; i < 10000; i++) {
pipelined.set("k:"+i,"v:"+i);
}
System.out.println(System.currentTimeMillis()-start);//55毫秒
jedis.close();
}
最后测试发现执行几乎瞬间完成,用时55毫秒,比4秒提升了70多倍。
它将所有操作都打包,一次性发给redis服务器,由原先一万次的传输变为一次传输,大大提高了传输性能,节省了时间。
而redis接收到之后做一万次写入,一万次写入对于redis来说小菜一碟。
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam
1、接口请求基本操作1.1例子tips在view的选项可以zoomin调整窗口字帖大小。1、创建一个测试的workspace,并命名为test2、test后面新增一个addrequest3、选择发送GET,URL为一个开源的https://api.apiopen.top/api/sentences获取每日一句4、点击send查看内容Tips:如果提示出现Error:tunnelingsocketcouldnotbeestablished,statusCode=407错误,参照以下解决办法)关于tunnelingsocketcouldnotbeestablished,cause=getaddri
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby解释器作为独立内核加载到内存中。一旦ruby解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大
假设我们有以下描述一个人的JSON对象:{"firstName":"John","lastName":"Smith","age":25,"address":{"streetAddress":"212ndStreet","city":"NewYork","state":"NY","postalCode":"10021"},"phoneNumber":[{"type":"home","number":"212555-1234"},{"type":"fax","number":"646555-4567"}]有人可以建议在Rails3中操作前一个对象的最优雅和最有效的方法吗?我希望能够:添加另