这篇文章主要讲了Java对redis的基本操作,包括了一下几个内容:

  1. redis的安装
  2. Java对redis的基本操作实例
  3. Java对redis的基本操作

 

redis的安装

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

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

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

安装方法如下:

Window 下安装

下载地址:https://github.com/MSOpenTech/redis/releases

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis

Java对redis的基本操作:读取和写入

打开一个 cmd 窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.windows.conf 。

如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:

Java对redis的基本操作:读取和写入

这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 。

设置键值对 set myKey abc

取出键值对 get myKey

Java对redis的基本操作:读取和写入


Linux 下安装

下载地址:http://redis.io/download,下载最新稳定版本。

本教程使用的最新文档版本为 2.8.17,下载并安装:

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make

make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

下面启动redis服务.

$ cd src
$ ./redis-server

注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。

$ cd src
$ ./redis-server ../redis.conf

redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

Ubuntu 下安装

在 Ubuntu 系统安装 Redis 可以使用以下命令:

$sudo apt-get update
$sudo apt-get install redis-server

启动 Redis

$ redis-server

查看 redis 是否启动?

$ redis-cli

以上命令将打开以下终端:

redis 127.0.0.1:6379>

127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。

redis 127.0.0.1:6379> ping
PONG

以上说明我们已经成功安装了redis。

Mac 下安装

1. 官网http://redis.io/ 下载最新的稳定版本,这里是3.2.0

2. sudo mv 到 /usr/local/

3. sudo tar -zxf redis-3.2.0.tar 解压文件

4. 进入解压后的目录 cd redis-3.2.0

5. sudo make test 测试编译

6. sudo make install

Java对redis的基本操作实例

Java对redis的基本操作实例的基本步骤:

打开本地redis-server;

打开运行java程序,写入redis-server

打开本地redis-cli,验证输入的内容

 

打开本地redis-server;

Java对redis的基本操作:读取和写入

 

打开运行java程序,run as Junit Test,写入redis-server

Java对redis的基本操作:读取和写入

打开本地redis-cli,验证输入的内容

Java对redis的基本操作:读取和写入

 

代码如下:

TestSingleRedis.java

package com.softarchitecture.redis;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.log4j.PropertyConfigurator;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.Transaction;
public class TestSingleRedis {
private static Jedis jedis;
private static ShardedJedis shard;
private static ShardedJedisPool pool;
public static Logger log = LoggerFactory.getLogger(TestSingleRedis.class);
@BeforeClass
public static void setUpBeforeClass() throws Exception {
//单个节点
jedis = new Jedis("127.0.0.1", 6379);
//分片
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("127.0.0.1",6379)); 
shard = new ShardedJedis(shards);
GenericObjectPoolConfig goConfig = new GenericObjectPoolConfig();
goConfig.setMaxTotal(100);
goConfig.setMaxIdle(20);
goConfig.setMaxWaitMillis(-1);
goConfig.setTestOnBorrow(true);        
pool = new ShardedJedisPool(goConfig, shards);
//PropertyConfigurator.configure("log4j.properties"); 
//jedis.del("student");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
jedis.disconnect();
shard.disconnect();
pool.destroy();
}
public Student queryData() {
Student student = new Student(1, 30, "cgx");
log.info("db----");
return student;
}
@Test
public void testJson() {
for(int i=0;i<10;i++) { String get = jedis.get("student"); if(get!=null && !get.equals("null")) { System.out.println("cache----");; } else { Student student = queryData(); String s = JSON.toJSONString(student); jedis.set("student", s); get = s; } Object object = JSON.parseObject(get, Student.class); System.out.println(object); } } @Test public void testString() { //-----添加数据---------- jedis.set("name","itlead");//向key-->name中放入了value-->xinxin  
System.out.println(jedis.get("name"));//执行结果:xinxin  
jedis.append("name", " is my lover"); //拼接
System.out.println(jedis.get("name")); 
jedis.del("name");  //删除某个键
System.out.println(jedis.get("name"));
//设置多个键值对
jedis.mset("name","itlead","age","27","qq","174754613");
jedis.incr("age"); //进行加1操作
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));
}
/**
* redis操作Map
*/
@Test
public void testMap() {
//-----添加数据----------  
Map<String, String> map = new HashMap<String, String>();
map.put("name", "xinxin");
map.put("age", "22");
map.put("qq", "123456");
jedis.hmset("user",map);
//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List  
//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数  
List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
System.out.println(rsmap);  
//删除map中的某个键值  
jedis.hdel("user","age");
System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null  
System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 
System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true  
System.out.println(jedis.hkeys("user"));//返回map对象中的所有key  
System.out.println(jedis.hvals("user"));//返回map对象中的所有value 
Iterator<String> iter=jedis.hkeys("user").iterator();  
while (iter.hasNext()){  
String key = iter.next();  
System.out.println(key+":"+jedis.hmget("user",key));  
}  
}
/** 
* jedis操作List 
*/  
@Test  
public void testList(){  
//开始前,先移除所有的内容  
jedis.del("java framework");  
System.out.println(jedis.lrange("java framework",0,-1));  
//先向key java framework中存放三条数据  
jedis.lpush("java framework","spring");  
jedis.lpush("java framework","struts");  
jedis.lpush("java framework","hibernate");  
//再取出所有数据jedis.lrange是按范围取出,  
// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有  
System.out.println(jedis.lrange("java framework",0,-1));  
jedis.del("java framework");
jedis.rpush("java framework","spring");  
jedis.rpush("java framework","struts");  
jedis.rpush("java framework","hibernate"); 
System.out.println(jedis.lrange("java framework",0,-1));
}  
/** 
* jedis操作Set 
*/  
@Test  
public void testSet(){  
//添加  
jedis.sadd("user","liuling");  
jedis.sadd("user","xinxin");  
jedis.sadd("user","ling");  
jedis.sadd("user","zhangxinxin");
jedis.sadd("user","who");  
//移除noname  
jedis.srem("user","who");  
System.out.println(jedis.smembers("user"));//获取所有加入的value  
System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素  
System.out.println(jedis.srandmember("user"));  
System.out.println(jedis.scard("user"));//返回集合的元素个数  
} 
@Test  
public void testRLpush() throws InterruptedException {  
//jedis 排序  
//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)  
jedis.del("a");//先清除数据,再加入数据进行测试  
jedis.rpush("a", "1");  
jedis.lpush("a","6");  
jedis.lpush("a","3");  
jedis.lpush("a","9");  
System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1]  
System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果  
System.out.println(jedis.lrange("a",0,-1));  
}  
@Test
public void testTrans() {
long start = System.currentTimeMillis();
Transaction tx = jedis.multi();
for (int i = 0; i < 1000; i++) {
tx.set("t" + i, "t" + i);
}
//System.out.println(tx.get("t1000").get());
List<Object> results = tx.exec();
long end = System.currentTimeMillis();
System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds");
}
@Test
public void testPipelined() {
Pipeline pipeline = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pipeline.set("p" + i, "p" + i);
}
//System.out.println(pipeline.get("p1000").get());
List<Object> results = pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
}
@Test
public void testPipelineTrans() {
long start = System.currentTimeMillis();
Pipeline pipeline = jedis.pipelined();
pipeline.multi();
for (int i = 0; i < 100000; i++) {
pipeline.set("" + i, "" + i);
}
pipeline.exec();
List<Object> results = pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
System.out.println("Pipelined transaction SET: " + ((end - start)/1000.0) + " seconds");
}
@Test
public void testShard() {
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String result = shard.set("shard" + i, "n" + i);
}
long end = System.currentTimeMillis();
System.out.println("shard SET: " + ((end - start)/1000.0) + " seconds");
}
@Test
public void testShardpipelined() {
ShardedJedisPipeline pipeline = shard.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
pipeline.set("sp" + i, "p" + i);
}
List<Object> results = pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
System.out.println("shardPipelined SET: " + ((end - start)/1000.0) + " seconds");
}
@Test
public void testShardPool() {
ShardedJedis sj = pool.getResource();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String result = sj.set("spn" + i, "n" + i);
}
long end = System.currentTimeMillis();
pool.returnResource(sj);
System.out.println("shardPool SET: " + ((end - start)/1000.0) + " seconds");
}
}

Student.java

package com.softarchitecture.redis;
public class Student {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int age;
private String name;
public Student() {
}
public Student(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "id=" + id + ",age=" + age + ",name=" + name;
}
}

Java对redis的基本操作的常用命令

1)连接操作命令
quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit

2)持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务

3)远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器

4)对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key

5)String
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
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的子串

6)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之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,

并将该元素添加到名称为dstkey的list的头部

7)Set
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素

8)Hash
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
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

 
转载请保留页面地址:https://www.breakyizhan.com/java/4854.html
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!