Java操作Redis详细介绍

1. 简介

Redis 是一个开源(BSD许可)的,内存中的key-value存储系统,它可以用作数据库、缓存和消息中间件。

2. 对key的操作

首先要建立连接Jedis jedis = new Jedis("127.0.0.1", 6379),然后就可以对string,set,zset,hash进行操作了。

//对key的测试
public void keyTest() {
	System.out.println(jedis.flushDB());
	//清空数据
	System.out.println(jedis.echo("hello"));
	//打印hello
	System.out.println(jedis.exists("foo"));
	//判断key是否存在
	jedis.set("key1", "values1");
	jedis.set("key2", "values2");
	System.out.println(jedis.exists("key1"));
	//判断key是否存在
	String randomKey = jedis.randomKey();
	//选择一个随机的key
	System.out.println("randomKey的为: " + randomKey);
	jedis.expire("key1", 60);
	//生存时间
	System.out.println(jedis.pttl("key1"));
	//剩下的生存时间
	//移除key的过期时间
	jedis.persist("key1");
	// 获取key的类型, "string", "list", "set" "none" none表示key不存在
	System.out.println("type的类型为: " + jedis.type("key1"));
	//key的类型
	// 导出key的值
	String value = jedis.get("key1");
	System.out.println(value);
	// 将key重命名
	jedis.renamenx("key1", "keytest");
	System.out.println("key1是否存在: " + jedis.exists("key1"));
	// 判断是否存在
	System.out.println("keytest是否存在: " + jedis.exists("keytest"));
	// 判断是否存在
	// 查询匹配的key
	// KEYS * 匹配数据库中所有 key 。
	// KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
	// KEYS h*llo 匹配 hllo 和 heeeeello 等。
	// KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
	// 特殊符号用 \ 隔开。
	Set<string> set = jedis.keys("k*");
	//获取所有相关的key keys方法
	System.out.println(set);
	jedis.del("key1");
	// 删除key del方法
	System.out.println(jedis.exists("key1"));
}

3. String数据类型

set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型

对字符串进行数值操作
127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"

Java操作代码为:

//对string操作的测试
public void stringTest() {
	jedis.set("hello", "hello");
	//set
	System.out.println(jedis.get("hello"));
	//get
	// 使用append 向字符串后面添加
	jedis.append("hello", " world");
	//追加 append方法
	System.out.println(jedis.get("hello"));
	// set覆盖字符串
	jedis.set("hello", "123");
	System.out.println(jedis.get("hello"));
	// 设置过期时间
	jedis.setex("hello2", 2, "world2");
	System.out.println(jedis.get("hello2"));
	try {
		Thread.sleep(3000);
	}
	catch (InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println(jedis.get("hello2"));
	// 一次添加多个key-value对
	jedis.mset("a", "1", "b", "2");
	// 获取a和b的value
	List<string> valus = jedis.mget("a", "b");
	System.out.println(valus);
	// 批量删除
	jedis.del("a", "b");
	System.out.println(jedis.exists("a"));
	System.out.println(jedis.exists("b"));
}

4. List数据类型

redis中的lists在底层实现上并不是数组,而是链表。

一系列操作:RPUSH, LPUSH, LLEN, LRANGE, LPOP和 RPOP。

我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。

//新建一个list叫做mylist,并在列表头部插入元素"1"
127.0.0.1:6379> lpush mylist "1"
//返回当前mylist中的元素个数
(integer) 1
//在mylist右侧插入元素"2"
127.0.0.1:6379> rpush mylist "2"
(integer) 2
//在mylist左侧插入元素"0"
127.0.0.1:6379> lpush mylist "0"
(integer) 3
//列出mylist中从编号0到编号1的元素
127.0.0.1:6379> lrange mylist 0 1
1) "0"
2) "1"
//列出mylist中从编号0到倒数第一个元素
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "1"
3) "2"

Java操作代码为:

public void listTest() {
	String key = "mylist";
	jedis.del(key);
	//把之前的删除
	// 队列添加元素
	jedis.rpush(key, "aaaa");
	jedis.rpush(key, "aaaa");
	jedis.rpush(key, "bbbb");
	jedis.rpush(key, "cccc");
	jedis.rpush(key, "cccc");
	//队列长度
	System.out.println("lenth: " + jedis.llen(key));
	// 打印队列,从索引0开始,到倒数第1个(全部元素)
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// 索引为1的元素
	System.out.println("index of 1: " + jedis.lindex(key, 1));
	// 设置队列里面一个元素的值,当index超出范围时会返回一个error。
	jedis.lset(key, 1, "aa22");
	System.out.println("index of 1: " + jedis.lindex(key, 1));
	// 从队列的右边入队一个元素
	jedis.rpush(key, "-2", "-1");
	// 先-2,后-1入队列
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// 从队列的左边入队一个或多个元素
	jedis.lpush(key, "second element", "first element");
	// 先second
	// element,后first
	// elementF入队列
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// 从队列的右边出队一个元素
	System.out.println(jedis.rpop(key));
	// 从队列的左边出队一个元素
	System.out.println(jedis.lpop(key));
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// count > 0: 从头往尾移除值为 value 的元素,count为移除的个数。
	// count < 0: 从尾往头移除值为 value 的元素,count为移除的个数。
	// count = 0: 移除所有值为 value 的元素。
	jedis.lrem(key, 1, "cccc");
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// 即最右边的那个元素也会被包含在内。 如果start比list的尾部下标大的时候,会返回一个空列表。
	// 如果stop比list的实际尾部大的时候,Redis会当它是最后一个元素的下标。
	System.out.println(jedis.lrange(key, 0, 2));
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
	// 删除区间以外的元素
	System.out.println(jedis.ltrim(key, 0, 2));
	System.out.println("all elements: " + jedis.lrange(key, 0, -1));
}

5. Set类型

redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
一系列操作:SADD, SREM, SISMEMBER, SMEMBERS 和 SUNION.
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。

//向集合myset中加入一个新元素"one"
127.0.0.1:6379> sadd myset "one"
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
//列出集合myset中的所有元素
127.0.0.1:6379> smembers myset
1) "one"
2) "two"
//判断元素1是否在集合myset中,返回1表示存在
127.0.0.1:6379> sismember myset "one"
(integer) 1
//判断元素3是否在集合myset中,返回0表示不存在
127.0.0.1:6379> sismember myset "three"
(integer) 0
//新建一个新的集合yourset
127.0.0.1:6379> sadd yourset "1"
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
//对两个集合求并集
127.0.0.1:6379> sunion myset yourset
1) "1"
2) "one"
3) "2"
4) "two"

Java操作代码:

public void setTest() {
	// 清空数据
	System.out.println(jedis.flushDB());
	String key = "myset1";
	String key2 = "myset2";
	// 集合添加元素
	jedis.sadd(key, "aaa", "bbb", "ccc");
	jedis.sadd(key2, "bbb", "ccc", "ddd");
	// 获取集合里面的元素数量
	System.out.println(jedis.scard(key));
	//the number count of the set
	// 获得两个集合的交集,并存储在一个关键的结果集
	jedis.sinterstore("destination", key, key2);
	System.out.println(jedis.smembers("destination"));
	// 获得两个集合的并集,并存储在一个关键的结果集
	jedis.sunionstore("destination", key, key2);
	System.out.println(jedis.smembers("destination"));
	// key1集合中,key2集合没有的元素,并存储在一个关键的结果集
	jedis.sdiffstore("destination", key, key2);
	System.out.println(jedis.smembers("destination"));
	// 确定某个元素是一个集合的成员
	System.out.println(jedis.sismember(key, "aaa"));
	// 从key集合里面随机获取一个元素
	System.out.println(jedis.srandmember(key));
	// aaa从key移动到key2集合
	jedis.smove(key, key2, "aaa");
	System.out.println(jedis.smembers(key));
	//获取集合中的元素
	System.out.println(jedis.smembers(key2));
	// 删除并获取一个集合里面的元素
	System.out.println(jedis.spop(key));
	// 从集合里删除一个或多个元素
	jedis.srem(key2, "ccc", "ddd");
	System.out.println(jedis.smembers(key2));
}

6. Sorted Sets类型

我们都将redis中的有序集合叫做zsets

//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1
127.0.0.1:6379> zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
127.0.0.1:6379> zadd myzset 3 360.com
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
127.0.0.1:6379> zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0.0.1:6379> zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
127.0.0.1:6379> zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"

Java操作代码为:

public void zsetTest() {
	// 清空数据
	System.out.println(jedis.flushDB());
	String key = "mysortset";
	Map<string, double=""> scoreMembers = new HashMap<>();
	scoreMembers.put("aaa", 1001.0);
	scoreMembers.put("bbb", 1002.0);
	scoreMembers.put("ccc", 1003.0);
	// 添加数据
	jedis.zadd(key, 1004.0, "ddd");
	jedis.zadd(key, scoreMembers);
	// 获取一个排序的集合中的成员数量
	System.out.println(jedis.zcard(key));
	// 返回的成员在指定范围内的有序集合,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
	// 负数下标,以-1表示最后一个成员,-2表示倒数第二个成员
	Set<string> coll = jedis.zrange(key, 0, -1);
	System.out.println(coll);
	// 返回的成员在指定范围内的逆序集合
	coll = jedis.zrevrange(key, 0, -1);
	System.out.println(coll);
	// 元素下标
	System.out.println(jedis.zscore(key, "bbb"));
	// 删除元素
	System.out.println(jedis.zrem(key, "aaa"));
	System.out.println(jedis.zrange(key, 0, -1));
	// 给定值范围内的成员数
	System.out.println(jedis.zcount(key, 1002.0, 1003.0));
}

7. Hash类型

hashes存的是字符串和字符串值之间的映射

//建立哈希,并赋值
127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
//更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "12345"
5) "age"
6) "34"

Java操作代码:

public void hashTest() {
	// 清空数据
	System.out.println(jedis.flushDB());
	String key = "myhash";
	Map<string, string=""> hash = new HashMap<>();
	hash.put("aaa", "11");
	hash.put("bbb", "22");
	hash.put("ccc", "33");
	// 添加数据
	jedis.hmset(key, hash);
	jedis.hset(key, "ddd", "44");
	// 获取hash的所有元素(key值)
	System.out.println(jedis.hkeys(key));
	// 获取hash中所有的key对应的value值
	System.out.println(jedis.hvals(key));
	// 获取hash里所有元素的数量
	System.out.println(jedis.hlen(key));
	// 获取hash中全部的域和值,以Map<string, string=""> 的形式返回
	Map<string, string=""> elements = jedis.hgetAll(key);
	System.out.println(elements);
	// 判断给定key值是否存在于哈希集中
	System.out.println(jedis.hexists(key, "bbb"));
	// 获取hash里面指定字段对应的值
	System.out.println(jedis.hmget(key, "aaa", "bbb"));
	// 获取指定的值
	System.out.println(jedis.hget(key, "aaa"));
	// 删除指定的值
	System.out.println(jedis.hdel(key, "aaa"));
	System.out.println(jedis.hgetAll(key));
	// 为key中的域 field 的值加上增量 increment
	System.out.println(jedis.hincrBy(key, "bbb", 100));
	System.out.println(jedis.hgetAll(key));
}

8. 事务

事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。
在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。

1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

redis> MULTI //标记事务开始
OK
redis> INCR user_id //多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC //执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

Java操作代码为:

public void transactionTest() {
	Transaction t = jedis.multi();
	//组装一个事务
	t.set("hello", "world");
	Response<string> response = t.get("hello");
	t.zadd("foo", 1, "barowitch");
	t.zadd("foo", 0, "barinsky");
	t.zadd("foo", 0, "barikoviev");
	Response<set<string>> sose = t.zrange("foo", 0, -1);
	// 返回全部相应并以有序集合的方式返回
	System.out.println(response);
	System.out.println(sose);
	t.exec();
	// 此行注意,不能缺少 执行
	String foolbar = response.get();
	// Response.get() 可以从响应中获取数据
	int soseSize = sose.get().size();
	// sose.get()
	System.out.println(foolbar);
	System.out.println(sose.get());
	System.out.println("集合的size为:" + soseSize);
}

管道操作Java代码:

public void transactionPipelineTest() {
	Pipeline p = jedis.pipelined();
	//开一个管道
	p.set("fool", "bar");
	p.zadd("foo", 1, "barowitch");
	p.zadd("foo", 0, "barinsky");
	p.zadd("foo", 0, "barikoviev");
	Response<string> pipeString = p.get("fool");
	Response<set<string>> sose = p.zrange("foo", 0, -1);
	System.out.println(pipeString);
	System.out.println(sose);
	p.sync();
	//提交
	System.out.println("==========");
	System.out.println(p.get("fool"));
	System.out.println(p.zrange("foo", 0, -1));
	int soseSize = sose.get().size();
	Set<string> setBack = sose.get();
	System.out.println(soseSize);
	System.out.println(setBack);
	System.out.println(pipeString.get());
}

总结

以上就是本文关于Java操作Redis详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。

时间: 2017-11-21

Redis入门教程_动力节点Java学院整理

Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). 一:Redis是什么? 这个我想怎么总结呢,突然发现再好的解释也没有redis官网解释的好,它的解释已经很好了. 人家也说了,redis是个内存存储的数据结构服务器,这个听起来有多么牛啊....一说到数据结构,第一反映就会想到Java中那些LinkedList,hashset,map,然后你也会想到这些数据结构有如下一些缺点.不能序列化到硬

redis事务_动力节点Java学院整理

我们都知道redis追求的是简单,快速,高效,在这种情况下也就拒绝了支持window平台,学sqlserver的时候,我们知道事务还算是个比较复杂的东西,所以这要是照搬到redis中去,理所当然redis就不是那么简单纯碎的东西了,但是呢,事务是我们写程序无法逃避的场景,所以redis作者折衷的写了个简化版的事务机制. 一: 事务实战 具体到事务是什么,要保证什么...这个我想没必要说了,先不管三七二十一,看一下redis手册,领略下它的魔力. 1. multi,exec 还记得sqlserve

java中对Redis的缓存进行操作的示例代码

Redis 是一个NoSQL数据库,也是一个高性能的key-value数据库.一般我们在做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加入缓存功能.Redis的高效缓存功能给我们解决了难题.下面我主要讲讲在Java项目中怎么去连接Redis服务器以及需要注意的事项. 1.导入必须的Jar包 使用Java操作Redis需要两个必须的Jar包:jedis-2.5.1.jar 和  commons-pool2-2.0.jar .每个版本可以不一样,根据你自己下载的

redis集群搭建_动力节点Java学院整理

现在项目上用redis的话,很少说不用集群的情况,毕竟如果生产上只有一台redis会有极大的风险,比如机器挂掉,或者内存爆掉,就比如我们生产环境曾今也遭遇到这种情况,导致redis内存不够挂掉的情况,当然这些都是我们及其不能容忍的,第一个必须要做到高可靠,其次才是高性能,好了,下面我来逐一搭建一下. 一:Redis集群搭建 1. 下载 首先去官网下载较新的3.2.0版本,下载方式还是非常简单的,比如官网介绍的这样. $ wget http://download.redis.io/releases

redis发布订阅_动力节点Java学院整理

其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个场景还能找到其他场景么,当然有啦,你想想,如果你要在内存里面做一个读写分离的程序,为了维持数据的完整性,你是不是需要保证在写入的时候,也要分发到各个读内存的程序中呢?所以说场景还是很多的,在于你的挖掘~~~ 下面还是从基本命令入手: 一:命令简介 从redis手册上面可以看到,其实"发布.订阅"

Java操作redis实现增删查改功能的方法示例

本文实例讲述了Java操作redis实现增删查改功能的方法.分享给大家供大家参考,具体如下: 首先,我们需要在windows下配置一个redis环境,具体配置教程请看:http://www.jb51.net/article/96230.htm 然后需要导入:jedis-2.7.3.jar这个包,看如下代码: package redis.main; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; imp

Python操作mysql数据库实现增删查改功能的方法

本文实例讲述了Python操作mysql数据库实现增删查改功能的方法.分享给大家供大家参考,具体如下: #coding=utf-8 import MySQLdb class Mysql_Oper: def __init__(self,host,user,passwd,db): self.host=host self.user=user self.passwd=passwd self.database=db def db_connecet(self): try: #连接 conn=MySQLdb.

Java操作Mongodb数据库实现数据的增删查改功能示例

本文实例讲述了Java操作Mongodb数据库实现数据的增删查改功能.分享给大家供大家参考,具体如下: 首先,我们在windows下安装mongodb数据库,安装教程可查看前面一篇文章:http://www.jb51.net/article/85605.htm 代码如下: package io.mogo; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.mongodb.BasicDBObj

ASP.NET实现电影票信息的增删查改功能

题目 1.使用Code First技术创建一个Movie数据模型. public class Movie { public int ID { get; set; } //电影编号 public string Title { get; set; } //电影名称 public DateTime ReleaseDate { get; set; } //上映时间 public string Genre { get; set; } //电影类型 public decimal Price { get; s

PHP实现数据库的增删查改功能及完整代码

本文用到:jquery.tp框架 TP_3.2.2/Application/Home/Controller/StuController.class.php <?php /** * Created by PhpStorm. * User: root * Date: 2018/4/17 * Time: 16:32 */ namespace Home\Controller; use Think\Controller; class StuController extends Controller { p

Yii2——使用数据库操作汇总(增删查改、事务)

本文介绍了 Yii2--使用数据库操作汇总(增删查改.事务),具体如下: 对象操作 查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll("username=:name",array(":name"=>$username)); $infoArr= NewsList::model()->findAll(&quo

浅谈Android手机联系人开发之增删查改功能

最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些bug,所以我把我最近的项目心得和方法写下来,既能帮助大家减少了解android开发手机联系人的门槛,好,废话少说,接下来直奔主题. 一.深入浅出手机联系人的前奏(小米手机的data表跟模拟器的data表不一样) 1.手机联系人主要是对contacts2.db数据库表的操纵,这个数据库中有三个表是比较重要的,分别是data,raw_contacts,mimetyps这三个表.在下面的增

Java通过MyBatis框架对MySQL数据进行增删查改的基本方法

1. 查询 除了单条记录的查询,这里我们来尝试查询一组记录. IUserMapper接口添加下面方法: List<User> getUsers(String name); 在User.xml中添加: <resultMap type="User" id="userList"><!-- type为返回列表元素的类全名或别名 --> <id column="id" property="id"

C# Access数据库增删查改的简单方法

引用集:using System.Data.OleDb; 复制代码 代码如下: static string exePath = System.Environment.CurrentDirectory;//本程序所在路径 //创建连接对象OleDbConnection conn = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;data source=" + exePath + @"\文件名.mdb");

golang使用json格式实现增删查改的实现示例

需求和思路 在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(Mysql)之类的不合适.使用sqlite3这种嵌入式的是个较好的方法,但是Go语言中sqlite3的库是C语言的,Cgo不支持跨平台编译.正是由于这种需求,才想到使用json格式将数据直接保存在文件中. 具体的思路是怎么样呢? 在Go语言中如果要将数据转化成json格式的话,有两种格式 struct 和 map. 如果同时需要增删查改功能的话,将map作为中间格式是比较合适的.接下