2019独角兽企业重金招聘Python工程师标准>>>

一、Redis Client介绍

1.1、简介

Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各类API进行封装调用。

Jedis源码工程地址:https://github.com/xetorthio/jedis

1.2、使用

Redis Client最好选用与服务端对应的版本,本例中使用Redis 2.8.19客户端使用jedis -2.6.3,Maven工程添加如下引用即可。

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.6.3</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

1.3、注意事项

Redis Client拥有众多对接版本,本项目目前使用Jedis为官方推荐Java对接客户端,是基于其对Redis良好的版本支持和API对接,另外编码中尽量避免使用废弃接口。

Redis目前正在新版过渡期,3.0版本暂未稳定,但是由于3.0版本提供了最新的集群功能,可能在日后稳定版发布以后升级到3.0,目前使用的Jedis支持3.0的目前版本API。

二、Redis Client常用API

2.1、环境要求

语言:Java

JDK:1.7

Redis : 2.8.19(稳定版)

2.2、系统使用

2.2.1、建立连接

  • 普通连接

Jedis jedis = new Jedis("localhost");

jedis.set("foo", "bar");

String value = jedis.get("foo");

System.out.println(value);

  • 设置连接池配置

该方法用于得到redis连接池连接使用的连接池配置,该连接池配置也可以通过spring注入的方式来进行相对应的配置,连接池采用的是平时比较常用的org.apache.commons.pool2.impl.GenericObjectPoolConfig来进行的连接池管理

配置文件如下

#redis服务器ip #

redis.ip=172.30.5.117

#redis服务器端口号#

redis.port=6379

###jedis##pool##config###

#jedis的最大分配对象#

jedis.pool.maxActive=1024

#jedis最大保存idel状态对象数 #

jedis.pool.maxIdle=200

#jedis池没有对象返回时,最大等待时间 #

jedis.pool.maxWait=1000

#jedis调用borrowObject方法时,是否进行有效检查#

jedis.pool.testOnBorrow=true

#jedis调用returnObject方法时,是否进行有效检查 #

jedis.pool.testOnReturn=true

连接池配置实例化代码(也可通过spring注入进行配置):

/**

* 获取化连接池配置

@return JedisPoolConfig

* */

private JedisPoolConfig getPoolConfig(){

if(config == null){

config = new JedisPoolConfig();

//最大连接数

config.setMaxTotal(Integer.valueOf(getResourceBundle().getString("redis.pool.maxTotal")));

//最大空闲连接数

config.setMaxIdle(Integer.valueOf(getResourceBundle().getString("redis.pool.maxIdle")));

//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1

config.setMaxWaitMillis(Long.valueOf(getResourceBundle().getString("redis.pool.maxWaitMillis")));

//在获取连接的时候检查有效性, 默认false

config.setTestOnBorrow(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnBorrow")));

//在获取返回结果的时候检查有效性, 默认false

config.setTestOnReturn(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnReturn")));

}

return config;

}

  • 普通连接池连接

这里展示的是普通的连接池方式链接redis的方案,跟普通的数据库连接池的操作方式类似;

/**

* 初始化JedisPool

* */

private void initJedisPool(){

if(pool == null){

//获取服务器IP地址

String ipStr = getResourceBundle().getString("redis.ip");

//获取服务器端口

int portStr = Integer.valueOf(getResourceBundle()

.getString("redis.port"));

//初始化连接池

pool = new JedisPool(getPoolConfig(), ipStr,portStr);

}

}

  • Sentinel连接池连接

该连接池用于应对Redis的Sentinel的主从切换机制,能够正确在服务器宕机导致服务器切换时得到正确的服务器连接,当服务器采用该部署策略的时候推荐使用该连接池进行操作;

private void initJedisSentinelPool(){

if(sentinelpool == null){

//监听器列表

Set<String> sentinels = new HashSet<String>();

//监听器1

sentinels.add(new HostAndPort("192.168.50.236",

26379).toString());

//监听器2

sentinels.add(new HostAndPort("192.168.50.237",

26379).toString());

//实际使用的时候在properties里配置即可:redis.sentinel.hostandports

=192.168.50.236:26379,192.168.50.237:26379

getResourceBundle().getString("redis.sentinel.hostandports")

//mastername是服务器上的master的名字,在master服务器的sentinel.conf中配置:

//[sentinel monitor server-1M  192.168.50.236 6379 2]

//中间的server-1M即为这里的masterName

String masterName = getResourceBundle()

.getString("redis.sentinel.masterName");

//初始化连接池

sentinelpool = new JedisSentinelPool(masterName,

sentinels, getPoolConfig());

}

}

  • ShardedJedisPool连接池分片连接

/**

* 初始化ShardedJedisPool

* Redis在容灾处理方面可以通过服务器端配置Master-Slave模式来实现。

* 而在分布式集群方面目前只能通过客户端工具来实现一致性哈希分布存储,即key分片存储。

* Redis可能会在3.0版本支持服务器端的分布存储

* */

private void initShardedJedisPool() {

if (shardPool == null) {

// 创建多个redis共享服务

String redis1Ip = getResourceBundle().getString("redis1.ip");

int redis1Port = Integer.valueOf(bundle.getString("redis.port"));

JedisShardInfo jedisShardInfo1 = new JedisShardInfo(redis1Ip, redis1Port);

String redis2Ip = getResourceBundle().getString("redis2.ip");

int redis2Port = Integer.valueOf(bundle.getString("redis.port"));

JedisShardInfo jedisShardInfo2 = new JedisShardInfo(redis2Ip, redis2Port);

List<JedisShardInfo> serverlist = new LinkedList<JedisShardInfo>();

serverlist.add(jedisShardInfo1);

serverlist.add(jedisShardInfo2);

// 初始化连接池

shardPool = new ShardedJedisPool(getPoolConfig(),serverlist);

}

}

  • 读写删除操作

// 从池中获取一个Jedis对象

Jedis jedis = sentinelpool.getSentinelpoolResource();

String keys = "name";

// 删除key-value对象,如果key不存在则忽略此操作

jedis.del(keys);

// 存数据

jedis.set(keys, "snowolf");

// 判断key是否存在,不存在返回false存在返回true

jedis.exists(keys);

// 取数据

String value = jedis.get(keys);

// 释放对象池(3.0将抛弃该方法)

sentinelpool.returnSentinelpoolResource(jedis);

三、示例代码

  1. 1.     String的简单追加

// 从池中获取一个Jedis对象

JedisUtil.getInstance().STRINGS.append(key, value);

  1. 2.     价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操作()

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

Set<Tuple> sumSet = JedisUtilEx.getInstance()

.getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);

//排序以后可以重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilEx.getInstance()

getLastPirceUpAndTimeDownSet();

  1. 3.  价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操作

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

Set<Tuple> sumSet = JedisUtilEx.getInstance()

. getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);

//排序以后可以重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilEx.getInstance()

getLastPirceDownAndTimeDownSet ();

  1. 4.     保存JavaBean到hash表中

// bean继承至RedisBean

JedisUtilEx.getInstance().setBeanToHash(bean);

  1. 5.     从hash表中读取JavaBean

//uuid为业务制定的唯一标识符规则(相当于主键)

String uuid = “1”; //该ID是我们提前就知道的

//T继承至RedisBean;

JedisUtilEx.getInstance().getBeanFromHash (uuid,Class<T> cls);

  1. 6.     将JavaBean列表装入hash中

//list中的bean继承至RedisBean

List<T> beanList = …;

JedisUtilEx.getInstance().setBeanListToHash(beanList);

//异步版本的存储列表到hash

JedisUtilEx.getInstance().setBeanListToHashSyn(beanList);

  1. 7.     普通的操作流程示例

//获取jedis引用

Jedis jedis = JedisUtil.getInstance().getJedis();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//执行完成以后务必释放资源

JedisUtil.getInstance().returnJedis(jedis);

//若以后不会使用JEDIS,需要关闭所有链接池

RedisConnetcion.destroyAllPools();

  1. 8.     事务执行流程

//获取连接资源

Jedis jd = JedisUtil.getInstance().getJedis();

//开启事务

Transaction ts = jd.multi();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//执行事务

List<Object> list = ts.exec();

//释放资源

JedisUtil.getInstance().returnJedis(jd);

  1. 9.     异步执行

//获取连接资源

Jedis jedis = JedisUtil.getInstance().getJedis();

//获取管道

Pipeline pipeline = jedis.pipelined();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//提交并释放管道

pipeline.syncAndReturnAll();

//释放资源

JedisUtil.getInstance().returnJedis(jedis);

  1. 10.  如何获取Jedis命名规则的合成KEY

//获取类的唯一键值key,例如:User:1(User为class,1为uuid)其中user继承于Reidsbean

JedisUtilEx.getInstance().getBeanKey(user);

//另一种获取类的唯一键值key的方法

JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls);

//获取bean对应的KEY(对应列的唯一键值key)

JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls,String... fileds);

//获取bean对应的KEY(集群key)

JedisUtilEx.getInstance().getBeanKey(Class<T> cls,String... fileds);

四、jedis操作命令:

1.对value操作的命令

exists(key):确认一个key是否存在

del(key):删除一个key

type(key):返回值的类型

keys(pattern):返回满足给定pattern的所有key

randomkey:随机返回key空间的一个key

rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

dbsize:返回当前数据库中key的数目

expire:设定一个key的活动时间(s)

ttl:获得一个key的活动时间

select(index):按索引查询

move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库

flushdb:删除当前选择数据库中的所有key

flushall:删除所有数据库中的所有key

2.对String操作的命令

set(key, value):给数据库中名称为key的string赋予值value

get(key):返回数据库中名称为key的string的value

getset(key, value):给名称为key的string赋予上一次的value

mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value

setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value

setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time

mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i

msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i

incr(key):名称为key的string增1操作

incrby(key, integer):名称为key的string增加integer

decr(key):名称为key的string减1操作

decrby(key, integer):名称为key的string减少integer

append(key, value):名称为key的string的值附加value

substr(key, start, end):返回名称为key的string的value的子串

3.对List操作的命令

rpush(key, value):在名称为key的list尾添加一个值为value的元素

lpush(key, value):在名称为key的list头添加一个值为value的 元素

llen(key):返回名称为key的list的长度

lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)

ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素

lindex(key, index):返回名称为key的list中index位置的元素

lset(key, index, value):给名称为key的list中index位置的元素赋值为value

lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0      从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。

lpop(key):返回并删除名称为key的list中的首元素

rpop(key):返回并删除名称为key的list中的尾元素

blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果 timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。

brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。

rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

4.对Set操作的命令

sadd(key, member):向名称为key的set中添加元素member

srem(key, member) :删除名称为key的set中的元素member

spop(key) :随机返回并删除名称为key的set中一个元素

smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合

scard(key) :返回名称为key的set的基数

sismember(key, member) :测试member是否是名称为key的set的元素

sinter(key1, key2,…key N) :求交集

sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合

sunion(key1, key2,…key N) :求并集

sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合

sdiff(key1, key2,…key N) :求差集

sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合

smembers(key) :返回名称为key的set的所有元素

srandmember(key) :随机返回名称为key的set的一个元素

5.对zset(sorted set)操作的命令

zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。

zrem(key, member) :删除名称为key的zset中的元素member

zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment

zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素

zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素

zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素

zcard(key):返回名称为key的zset的基数

zscore(key, element):返回名称为key的zset中元素element的score

zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素

zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素

zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行 SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

6.对Hash操作的命令

hset(key, field, value):向名称为key的hash中添加元素field<—>value

hget(key, field):返回名称为key的hash中field对应的value

hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value

hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i

hincrby(key, field, integer):将名称为key的hash中field的value增加integer

hexists(key, field):名称为key的hash中是否存在键为field的域

hdel(key, field):删除名称为key的hash中键为field的域

hlen(key):返回名称为key的hash中元素个数

hkeys(key):返回名称为key的hash中所有键

hvals(key):返回名称为key的hash中所有键对应的value

hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

五、Redis命名规则

由于Redis所有数据为键值对,即所有数据均只能通过键值(Key)来进行管理,故需

要规范命名规则,jedis客户端包装了有专门的命名规则生产函数,调用即可!代码参考实例代码

转载于:https://my.oschina.net/zhanggc/blog/1605142

jedis常用API相关推荐

  1. Jedis常用API整理-详细

    Jedis常用API整理 redis是一种高级的key-value的存储系统 其中的key是字符串类型,尽可能满足如下几点: 其中value 支持五种数据类型: jedis语法总结 1. jedis中 ...

  2. c++ string replace_JAVA应用程序开发之String类常用API

    [本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 API ( Application Interface 应用程序接口)是类中提供的接口, ...

  3. 常用API(Object、String、StringBuffer、用户登陆注册)

    常用API 今日内容介绍 u Object u String u StringBuilder 第1章 Java的API及Object类 在以前的学习过程中,我们都在学习对象基本特征.对象的使用以及对象 ...

  4. Selenium Web 自动化 - Selenium常用API

    Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作   1.1 用webdriver打开一个浏览器   1.2 最大化浏览器&关闭浏 ...

  5. 【Netty】NIO 网络通信 SelectionKey 常用 API 简介

    文章目录 I . SelectionKey 简介 II . SelectionKey 事件简介 III . SelectionKey 常用 API 简介 I . SelectionKey 简介 1 . ...

  6. JavaScript一些常用 API整理汇总

    JavaScript一些常用 API整理汇总 Array new Set() 数组去重 const arr = [3,4,4,5,4,6,5,7]; console.log(new Set(arr)) ...

  7. Math工具类常用API使用案例

    对基础API的使用能够熟练掌握,能极大提高开发效率.有些知识是很简单,但并不是我们不学习和掌握它们的借口,越是简单的东西,在关键时刻越是能起到至关重要的作用,就好比我们花很长时间解决的一个BUG,结果 ...

  8. Hibernate一级缓存常用API

    一级缓存特点: 当我们通过session的save,update saveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存. 当我们通过session的 ...

  9. Object类、常用API

    # [Object类.常用API] ## 主要内容 * Object类 * Date类 * DateFormat类 * Calendar类 * System类 * StringBuilder类 * 包 ...

最新文章

  1. 【AC Saber】数据结构
  2. Apple Swift 编程语言入门教程
  3. 从 vue3 和 vite 源码中,我学到了一行代码统一规范团队包管理器的神器
  4. iOS中Safari浏览器select下拉列表文字太长被截断的处理方法
  5. 89. Gray Code - LeetCode
  6. dem聚类只能成为一类
  7. Linux(11)--(历史命令)Ctrl+r, history,!
  8. C#LeetCode刷题之#237-删除链表中的节点(Delete Node in a Linked List)
  9. 嵌入式中常见的存储器总结(一)存储器分类
  10. 【SQL】找出行数与自增标识值不相等的表(即有缺行)
  11. pointers on c (day 1,chapter3)
  12. linux中查看resin进程,resin安装
  13. 8个问题看你是否真的懂 JS
  14. 笔记本电脑双显卡怎么切换独立显卡的方法
  15. 【bzoj4972】小Q的方格纸 前缀和
  16. 职场Word使用技巧大全,教你成为职场高手!
  17. JZOJ 5442 荒诞
  18. 程序员找工作遇到的“了解、熟悉、精通”的三种技能要求实际上是这样的标准!
  19. PyQt5基础使用!(三)
  20. Windows系统盘清理

热门文章

  1. hibernate防止sql注入对参数赋值传参数的例子
  2. Post请求和get请求乱码方式解决
  3. Shell脚本之IP网络地址和广播地址计算
  4. 火狐SEO插件:查询网站收录与外链的火狐油猴脚本工具
  5. Windows 7各服务项介绍
  6. 服务器RAID技术及应用
  7. Mysql计算出年纪
  8. Linux系统下GitLab服务的的搭建
  9. 一个关于Python字符串格式化输出的练习
  10. 吴恩达深度学习笔记(四)—— 正则化