一、Redis 简介

  Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

  Redis 与其他 key - value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份

二、Redis 服务安装

  请从https://github.com/MicrosoftArchive/redis/releases 这里下载最新版本的redis服务安装包,在windows下开发,建议安装成自启动服务方便管理。

  

  

三、为自己的java项目添加redis依赖包(maven)

  我这里使用的是jedis-2.9.0.jar,该jar包自动引入连接池管理包commons-pool2-2.4.2.jar。

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

  

四、基于jedis创建redis连接池(单机版&分布式)

public class RedisClient {
private static JedisPool jedisPool;// 非切片连接池
private static ShardedJedisPool shardedJedisPool;// 切片连接池
static {
initialPool();
initialShardedPool();
} /**
* 初始化非切片池
*/
private static void initialPool() {
// 池基本配置
jedisPool = new JedisPool(getConfig(), "127.0.0.1", 6379);
} /**
* 初始化切片池
*/
private static void initialShardedPool() {
// slave链接
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add(new JedisShardInfo("127.0.0.1", 6379, "master"));
//远程连接
shards.add(new JedisShardInfo("192.168.0.122", 6379, "news"));
// 构造池
shardedJedisPool = new ShardedJedisPool(getConfig(), shards);
}
/**
* 获取基础配置
* @return
*/
private static JedisPoolConfig getConfig(){
// 池基本配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setMaxWaitMillis(20*1000L);
config.setTestOnBorrow(false);
return config;
}
  1. initialPool:创建一个单机版的连接池。如果缓存数据量过大,单机内存有可能不够用。
  2. initialShardedPool:创建一个分布式的连接池。可以配置多台机器的redis服务,存储由组件自动选择。分布式存储的实现可以简单了解一下源码结构,参考:https://www.cnblogs.com/vhua/p/redis_2.html
  3. getConfig:设置个性化配置项
    • MaxTotal:允许的最大连接数,超过后返回null。这里get到了java的一个技能点,小分享AtomicLong(线程安全的计数器),在多线程环境下可以正常计数,incrementAndGet:加1,decrementAndGet:减1;

      

      

    • MaxIdle:允许的最大空闲连接数,超过后连接会被回收;
    • MaxWaitMillis:一次连接的超时时限;

五、基于jedis对redis数据库的基本操作

  参考博文:https://www.cnblogs.com/edisonfeng/p/3571870.html

private Jedis jedis;// 非切片额客户端连接
private ShardedJedis shardedJedis;// 切片额客户端连接 public RedisClient() {
jedis = jedisPool.getResource();
shardedJedis = shardedJedisPool.getResource();
} public void show() {
KeyOperate();
StringOperate();
ListOperate();
SetOperate();
SortedSetOperate();
HashOperate();
// 关闭连接池
jedis.close();
shardedJedis.close();
// jedisPool.returnResource(jedis);
// shardedJedisPool.returnResource(shardedJedis);
} private void KeyOperate() {
System.out.println("======================key==========================");
// 清空数据
System.out.println("清空库中所有数据:" + jedis.flushDB());
// 判断key否存在
System.out.println("判断key999键是否存在:" + shardedJedis.exists("key999"));
System.out.println("新增key001,value001键值对:" + shardedJedis.set("key001", "value001"));
System.out.println("判断key001是否存在:" + shardedJedis.exists("key001"));
// 输出系统中所有的key
System.out.println("新增key002,value002键值对:" + shardedJedis.set("key002", "value002"));
System.out.println("系统中所有键如下:");
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key);
}
// 删除某个key,若key不存在,则忽略该命令。
System.out.println("系统中删除key002: " + jedis.del("key002"));
System.out.println("判断key002是否存在:" + shardedJedis.exists("key002"));
// 设置 key001的过期时间
System.out.println("设置 key001的过期时间为5秒:" + jedis.expire("key001", 5));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
// 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
System.out.println("查看key001的剩余生存时间:" + jedis.ttl("key001"));
// 移除某个key的生存时间
System.out.println("移除key001的生存时间:" + jedis.persist("key001"));
System.out.println("查看key001的剩余生存时间:" + jedis.ttl("key001"));
// 查看key所储存的值的类型
System.out.println("查看key所储存的值的类型:" + jedis.type("key001"));
/*
* 一些其他方法:1、修改键名:jedis.rename("key6", "key0");
* 2、将当前db的key移动到给定的db当中:jedis.move("foo", 1)
*/
} private void StringOperate() {
System.out.println("======================String_1==========================");
// 清空数据
System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增=============");
jedis.set("key001", "value001");
jedis.set("key002", "value002");
jedis.set("key003", "value003");
System.out.println("已新增的3个键值对如下:");
System.out.println(jedis.get("key001"));
System.out.println(jedis.get("key002"));
System.out.println(jedis.get("key003")); System.out.println("=============删=============");
System.out.println("删除key003键值对:" + jedis.del("key003"));
System.out.println("获取key003键对应的值:" + jedis.get("key003")); System.out.println("=============改=============");
// 1、直接覆盖原来的数据
System.out.println("直接覆盖key001原来的数据:" + jedis.set("key001", "value001-update"));
System.out.println("获取key001对应的新值:" + jedis.get("key001"));
// 2、直接覆盖原来的数据
System.out.println("在key002原来值后面追加:" + jedis.append("key002", "+appendString"));
System.out.println("获取key002对应的新值" + jedis.get("key002")); System.out.println("=============增,删,查(多个)=============");
/**
* mset,mget同时新增,修改,查询多个键值对 等价于: jedis.set("name","ssss");
* jedis.set("jarorwar","xxxx");
*/
System.out.println("一次性新增key201,key202,key203,key204及其对应值:"
+ jedis.mset("key201", "value201", "key202", "value202", "key203", "value203", "key204", "value204"));
System.out.println(
"一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204"));
System.out.println("一次性删除key201,key202:" + jedis.del(new String[] { "key201", "key202" }));
System.out.println(
"一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204"));
System.out.println(); // jedis具备的功能shardedJedis中也可直接使用,下面测试一些前面没用过的方法
System.out.println("======================String_2==========================");
// 清空数据
System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============新增键值对时防止覆盖原先值=============");
System.out.println("原先key301不存在时,新增key301:" + shardedJedis.setnx("key301", "value301"));
System.out.println("原先key302不存在时,新增key302:" + shardedJedis.setnx("key302", "value302"));
System.out.println("当key302存在时,尝试新增key302:" + shardedJedis.setnx("key302", "value302_new"));
System.out.println("获取key301对应的值:" + shardedJedis.get("key301"));
System.out.println("获取key302对应的值:" + shardedJedis.get("key302")); System.out.println("=============超过有效期键值对被删除=============");
// 设置key的有效期,并存储数据
System.out.println("新增key303,并指定过期时间为2秒" + shardedJedis.setex("key303", 2, "key303-2second"));
System.out.println("获取key303对应的值:" + shardedJedis.get("key303"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("3秒之后,获取key303对应的值:" + shardedJedis.get("key303")); System.out.println("=============获取原值,更新为新值一步完成=============");
System.out.println("key302原值:" + shardedJedis.getSet("key302", "value302-after-getset"));
System.out.println("key302新值:" + shardedJedis.get("key302")); System.out.println("=============获取子串=============");
System.out.println("获取key302对应值中的子串:" + shardedJedis.getrange("key302", 5, 7));
} private void ListOperate() {
System.out.println("======================list==========================");
// 清空数据
System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增=============");
shardedJedis.lpush("stringlists", "vector");
shardedJedis.lpush("stringlists", "ArrayList");
shardedJedis.lpush("stringlists", "vector");
shardedJedis.lpush("stringlists", "vector");
shardedJedis.lpush("stringlists", "LinkedList");
shardedJedis.lpush("stringlists", "MapList");
shardedJedis.lpush("stringlists", "SerialList");
shardedJedis.lpush("stringlists", "HashList");
shardedJedis.lpush("numberlists", "3");
shardedJedis.lpush("numberlists", "1");
shardedJedis.lpush("numberlists", "5");
shardedJedis.lpush("numberlists", "2");
System.out.println("所有元素-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
System.out.println("所有元素-numberlists:" + shardedJedis.lrange("numberlists", 0, -1)); System.out.println("=============删=============");
// 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
System.out.println("成功删除指定元素个数-stringlists:" + shardedJedis.lrem("stringlists", 2, "vector"));
System.out.println("删除指定元素之后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
// 删除区间以外的数据
System.out.println("删除下标0-3区间之外的元素:" + shardedJedis.ltrim("stringlists", 0, 3));
System.out.println("删除指定区间之外元素后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
// 列表元素出栈
System.out.println("出栈元素:" + shardedJedis.lpop("stringlists"));
System.out.println("元素出栈后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); System.out.println("=============改=============");
// 修改列表中指定下标的值
shardedJedis.lset("stringlists", 0, "hello list!");
System.out.println("下标为0的值修改后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
System.out.println("=============查=============");
// 数组长度
System.out.println("长度-stringlists:" + shardedJedis.llen("stringlists"));
System.out.println("长度-numberlists:" + shardedJedis.llen("numberlists"));
// 排序
/*
* list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"),
* 会出现"ERR One or more scores can't be converted into double"
*/
SortingParams sortingParameters = new SortingParams();
sortingParameters.alpha();
sortingParameters.limit(0, 3);
System.out.println("返回排序后的结果-stringlists:" + shardedJedis.sort("stringlists", sortingParameters));
System.out.println("返回排序后的结果-numberlists:" + shardedJedis.sort("numberlists"));
// 子串: start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素
System.out.println("子串-第二个开始到结束:" + shardedJedis.lrange("stringlists", 1, -1));
// 获取列表指定下标的值
System.out.println("获取下标为2的元素:" + shardedJedis.lindex("stringlists", 2) + "\n");
} private void SetOperate() { System.out.println("======================set==========================");
// 清空数据
System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增=============");
System.out.println("向sets集合中加入元素element001:" + jedis.sadd("sets", "element001"));
System.out.println("向sets集合中加入元素element002:" + jedis.sadd("sets", "element002"));
System.out.println("向sets集合中加入元素element003:" + jedis.sadd("sets", "element003"));
System.out.println("向sets集合中加入元素element004:" + jedis.sadd("sets", "element004"));
System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets"));
System.out.println(); System.out.println("=============删=============");
System.out.println("集合sets中删除元素element003:" + jedis.srem("sets", "element003"));
System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets"));
/*
* System.out.println("sets集合中任意位置的元素出栈:"+jedis.spop("sets"));//注:
* 出栈元素位置居然不定?--无实际意义
* System.out.println("查看sets集合中的所有元素:"+jedis.smembers("sets"));
*/
System.out.println(); System.out.println("=============改=============");
System.out.println(); System.out.println("=============查=============");
System.out.println("判断element001是否在集合sets中:" + jedis.sismember("sets", "element001"));
System.out.println("循环查询获取sets中的每个元素:");
Set<String> set = jedis.smembers("sets");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
System.out.println(); System.out.println("=============集合运算=============");
System.out.println("sets1中添加元素element001:" + jedis.sadd("sets1", "element001"));
System.out.println("sets1中添加元素element002:" + jedis.sadd("sets1", "element002"));
System.out.println("sets1中添加元素element003:" + jedis.sadd("sets1", "element003"));
System.out.println("sets2中添加元素element002:" + jedis.sadd("sets2", "element002"));
System.out.println("sets2中添加元素element003:" + jedis.sadd("sets2", "element003"));
System.out.println("sets2中添加元素element004:" + jedis.sadd("sets2", "element004"));
System.out.println("查看sets1集合中的所有元素:" + jedis.smembers("sets1"));
System.out.println("查看sets2集合中的所有元素:" + jedis.smembers("sets2"));
System.out.println("sets1和sets2交集:" + jedis.sinter("sets1", "sets2"));
System.out.println("sets1和sets2并集:" + jedis.sunion("sets1", "sets2"));
System.out.println("sets1和sets2差集:" + jedis.sdiff("sets1", "sets2"));// 差集:set1中有,set2中没有的元素 } private void SortedSetOperate() {
System.out.println("======================zset==========================");
// 清空数据
System.out.println(jedis.flushDB()); System.out.println("=============增=============");
System.out.println("zset中添加元素element001:" + shardedJedis.zadd("zset", 7.0, "element001"));
System.out.println("zset中添加元素element002:" + shardedJedis.zadd("zset", 8.0, "element002"));
System.out.println("zset中添加元素element003:" + shardedJedis.zadd("zset", 2.0, "element003"));
System.out.println("zset中添加元素element004:" + shardedJedis.zadd("zset", 3.0, "element004"));
System.out.println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));// 按照权重值排序
System.out.println(); System.out.println("=============删=============");
System.out.println("zset中删除元素element002:" + shardedJedis.zrem("zset", "element002"));
System.out.println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));
System.out.println(); System.out.println("=============改=============");
System.out.println(); System.out.println("=============查=============");
System.out.println("统计zset集合中的元素中个数:" + shardedJedis.zcard("zset"));
System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:" + shardedJedis.zcount("zset", 1.0, 5.0));
System.out.println("查看zset集合中element004的权重:" + shardedJedis.zscore("zset", "element004"));
System.out.println("查看下标1到2范围内的元素值:" + shardedJedis.zrange("zset", 1, 2)); } private void HashOperate() {
System.out.println("======================hash==========================");
// 清空数据
System.out.println(jedis.flushDB()); System.out.println("=============增=============");
System.out.println("hashs中添加key001和value001键值对:" + shardedJedis.hset("hashs", "key001", "value001"));
System.out.println("hashs中添加key002和value002键值对:" + shardedJedis.hset("hashs", "key002", "value002"));
System.out.println("hashs中添加key003和value003键值对:" + shardedJedis.hset("hashs", "key003", "value003"));
System.out.println("新增key004和4的整型键值对:" + shardedJedis.hincrBy("hashs", "key004", 4l));
System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
System.out.println(); System.out.println("=============删=============");
System.out.println("hashs中删除key002键值对:" + shardedJedis.hdel("hashs", "key002"));
System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
System.out.println(); System.out.println("=============改=============");
System.out.println("key004整型键值的值增加100:" + shardedJedis.hincrBy("hashs", "key004", 100l));
System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
System.out.println(); System.out.println("=============查=============");
System.out.println("判断key003是否存在:" + shardedJedis.hexists("hashs", "key003"));
System.out.println("获取key004对应的值:" + shardedJedis.hget("hashs", "key004"));
System.out.println("批量获取key001和key003对应的值:" + shardedJedis.hmget("hashs", "key001", "key003"));
System.out.println("获取hashs中所有的key:" + shardedJedis.hkeys("hashs"));
System.out.println("获取hashs中所有的value:" + shardedJedis.hvals("hashs"));
System.out.println();
}

java-redis初探的更多相关文章

  1. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  2. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  3. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

  4. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  5. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  6. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  7. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  8. java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...

  9. Java Redis系列1 关系型数据库与非关系型数据库的优缺点及概念

    Java Redis系列1 关系型数据库与非关系型数据库的优缺点及概念 在学习redis之前我们先来学习两个概念,即什么是关系型数据库什么是非关系型数据库,二者的区别是什么,二者的关系又是什么? ** ...

  10. Java Redis系列2 (redis的安装与使用+redis持久化的实现))

    Java Redis系列2 (redis的安装与使用+redis持久化的实现) 什么是Redis? Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50 ...

随机推荐

  1. impala集成sentry

    1.安装配置sentry 详细步骤见上一篇安装配置sentry. 2.配置impala 注:以下配置未集成kerberos安全认证 在/etc/imapla/conf目录下创建sentry-site. ...

  2. Windows脚本修改主机名-不重启

    windows通过脚本方式修改主机名的方法有很多种,下面介绍修改注册表方式的脚本. 使用方法: 1 打开cmd,假如脚本名为ModifyHostname.bat 2 执行脚本,并加入脚本参数,其中第一 ...

  3. 流API--流的收集

    前面的一系列博客中,我们都是从一个集合中拿到一个流,但是有时候需要执行反操作,就是从流中获得集合.实际编码中,当我们处理完流后,我们通常想查看下结果,而不是将他们聚合成一个值.我们可以调用iterat ...

  4. j2e中操作EXCEL

    在j2e中操作excel,无非2种情况,在这里我贴部分代码做个例子就OK,不管是导入和导出都是操作的都是流 1,导入,浏览器输入EXCEL到java后台解析 package action; impor ...

  5. Linux服务器删除乱码文件和文件夹的方法

    Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...

  6. java Object类是可以接收集合类型的

    废话不多说,上代码: package com.core.test; import java.util.ArrayList; import java.util.HashMap; import java. ...

  7. JavaWeb项目架构之Kafka分布式日志队列

    架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了. kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由S ...

  8. SQL explain详细结果

    explain 的结果 id select_type 查询的序列号 select_type simple (不含子查询) primary (含子查询.或者派生查询) subquery (非from子查 ...

  9. ABP官方文档翻译 3.7 领域事件(事件总线)

    领域事件(事件总线) 事件总线 注入IEventBus 获取默认实例 定义事件 预定义事件 处理异常 实体更改 触发事件 处理事件 处理基础事件 处理者异常 处理多个事件 注册处理者 自动 手动 取消 ...

  10. SEO页面优化以及如何对单页面应用进行SEO优化

    一.简介 1.何为SEO? SEO(search engine optimization),翻译为搜索引擎优化,是利用搜索引擎的搜索规则来提高在相关搜索引擎的排名以及访问量的方式. 2.目的 为了获取 ...