redis简明介绍和jedis的使用

Redis的介绍和Jedis的使用入坑


redis的作者是意大利的。是个人开发的数据库。Redis=remote dictionary sever,远程字典服务器


Redis是通常的描述,基于内存,可持久化的,键值方式的存储。
其实Redis有五种数据结构,只是其中一种数据结构用了键值对的形式。


有本书写得不错,《The Little Redis Book》,可以当一个入门了解学习使用。


https://github.com/karlseguin/the-little-redis-book


之前看的时候还想自己翻译一下,发现中文的都有两个版本存在了。
作者还写了《the little mongodb book》还有《the little go book》


具体的基础自己看书敲敲大概就了解了Redis是个什么样的东西了。我是之前好奇学了一下就放在一边不理了。
因为具体没用到。


https://github.com/xetorthio/jedis 
Jedis是Redis的java客户端,兼容Redis2.8.x和3.0.x,作者是个西班牙人。
说真的其实找个教程马上上手Jedis使用是很容易的。但是这次我想从官方文档中直接自己使用。
平时如果文档说明详细的话,上手简单,但是这次不一样。所以就开始踩坑了。慢慢摸索下学习的思路。


单纯从首页的介绍,会发现介绍得好简单。
加入maven依赖
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>


然后
Jedis jedis = new Jedis("localhost");
jedis.set("foo", "bar");
String value = jedis.get("foo");


一启动报错,发现自己的redis已经很久没用了。我本地的是下了个windows版本做测试。先要把服务端启动先。运行正常。


因为之前redis就开个服务端和客户端敲敲看是什么东西,后面没用到,就一直放在那里不用了。
现在真正接触了,就重新拿出来了。


用到的原因在于大并发发送数据又要写数据又要读数据的时候,可以把数据存入redis这样基于内存的存储中,读取和写入都比RDBMS快,
而要写入数据库的部分则另起一个线程慢慢写入即可。


正常的里面不止localhost这么简单,需要密码验证。修改redis.windows.conf,我的是2.4版本,修改redis文件夹中redis.conf。去除注释requirepass xx,然后设置 requirepass myredis,后面跟你所需要的密码。
但是重新启动之后发现密码验证没有起效。
redis 127.0.0.1:6379> config get requirepass
1) "requirepass"
2) (nil)
之前看过ruby,nil就是空的意思。


需要用另一种方式启动,让配置加载进去。dos命令进入自己安装路径:G:\redis>redis-server.exe redis.conf


然后登录需要验证了
redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted


验证只需要输入 auth myredis(自己设置的密码)




那这种增加密码之后的客户端的操作换做Jedis处理,就不像例子那样简单了。
还是那样的代码运行会有Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR operation not permitted






auth方法用于密码验证。这里是刚开始入的坑。


Jedis jedis = new Jedis("localhost");
jedis.auth("myredis");
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
jedis.close();


至于其余的用法,作者只丢下:
For more usage examples check the tests.
Please check the wiki. There are lots of cool things you should know, including information about connection pooling.


让你自己去看了。进入wiki继续。


多线程环境使用同一个实例是会有奇怪的错误的。单独的一个Jedis实例不是线程安全的。
避免这种问题是使用JedisPool,一个网络连接线程安全池。可以创建多个Jedis实例。
JedisPool基于Commons Pool 2,用的是对象池的设计模式


这个再深入的时候,就是连接池的东西,
数据库连接池简介
http://www.cnblogs.com/shipengzhi/archive/2011/06/07/2074396.html这个深入写的挺好。
最小连接数是连接池一直保持的数据库连接,当有人用的时候不用去创建,直接那现有的用,快很多。
而最大连接数是连接池能申请的最大连接数,超过的就要排队等了。


对象池 http://www.cnblogs.com/shipengzhi/archive/2011/06/02/2068565.html
这里面有对象借还的问题,如果不理解的话,根本不知道后面的borrow和return指的是什么。


对象池是包含一定对象的容器。初始化对象实例频繁开销大情况高效的解决方式,




https://www.javacodegeeks.com/2013/08/simple-and-lightweight-pool-implementation.html
这里是简单的实现
Executor 
ConcurrentLinkedQueue 
ScheduledExecutorService
这里Executor的要回去看多线程的书,不过最近在刷西部世界。好烧脑。


但是大体的思路是一个链表,存放一定的对象,从这里控制对象的借还。


回到原来的问题,找了半天在Commons pool官方文档里面没找到什么东西,反而在Tomcat的jdbc pool里面
有具体的这些属性的介绍。
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
testOnBorrow:(boolean) The indication of whether objects will be validated before being borrowed from the pool. If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another. NOTE - for a true value to have any effect, the validationQuery or validatorClassName parameter must be set to a non-null string. In order to have a more efficient validation, see validationInterval. Default value is false


对象从对象池借出过程中是否需要验证的指示。验证失败将从池中除去,再尝试借另一个。


testOnReturn :(boolean) The indication of whether objects will be validated before being returned to the pool. NOTE - for a true value to have any effect, the validationQuery or validatorClassName parameter must be set to a non-null string. The default value is false.
对象从对象池返回过程中是否需要验证的指示。






//JedisPool基于Commons Pool 2,所以可以配置
JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");


//同样的道理,查看api文档,JedisPool不是用auth验证,而是构造方法中传入
//JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost",6379,8000,"myredis");




try (Jedis jedis = pool.getResource()) {
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  //zadd zrange都属于其他数据结构里面的有序集合,相当于有权重,简单理解可以看成你特别关注的数据权重大
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike");    
  Set<String> sose = jedis.zrange("sose", 0, -1);
}
/// ... when closing your application:
pool.destroy();


入完坑之后,发现坑其实不坑。自己坑了自己罢了。


其实Jedis作为一个客户端的,只是给你提供Java方面的操作。
而,redis命令这块,不需要我继续造轮子了,https://redis.io/commands
将这个commands的auth命令,hmset这些与例子中的代码一比较。结合Jedis本身的test还有api。
调用具体的命令其实不难。

猜你喜欢

转载自blog.csdn.net/iaiti/article/details/53397282
今日推荐