赞
踩
善始者繁多,克终者盖寡。
按照存储类型进行划分,Redis属于键值数据库的一种,其他常见的数据库如下图所示。Redis是基于内存的数据库,所有在数据读写方面它比mysql、mongodb等数据库要快,当数据库中数据量足够巨大时,系统的性能也会受到影响,所以通常情况下Redis数据库中的键都会有一个过期时间(Time To Live),与之相对的为了让数据更长久的保存下来,Redis需要进行数据持久化操作,具体来说有RDB和AOF两种方式,RDB是Redis默认持久化方式,可以理解为定期持久化,AOF类似于实时持久化。因为Redis数据库的数据读写速度快,所有它常常被用在缓存、计数器(秒杀功能)、消息队列上。
Windows环境下下载Redis主要有两种渠道:官方下载和社区下载。推荐使用社区下载!!!
Redis官方发布的Linux和其他平台的Redis最新版本为7.2,但是!Windows版本还停留在3.x版本,据说官方已不再更新和维护Windows版本,也就是从官方渠道只能下载3.x的Windos版Redis。
第三方开发团队提供了更新的Windows版Redis,目前最新版本为5.0.14.1。
Windows版的Redis文件结构非常简单,将压缩包解压后可得到下图文件。
各程序功能描述如下图所示。使用Redis的第一步操作时启动Redis服务器,第二步是启动Redis客户端(默认地址和端口为127.0.0.1:6379)。
Redis服务器启动成功后会显示Reids版本、端口号、进程号、Redis配置文件地址等信息。
使用“ping”指令可以检查当前客户端与服务器连接情况,返回“PONG”时表明连接没有问题。
ping
使用“info”指令可以查看当前Redis数据库服务器、客户端、内存使用情况、持久化等信息。
keys *
通过该指令可以用来验证指令和操作是否生效。
flushall
通过该指令可以清空内存中所有的key。
赋值与取值
set key value [NX/UX]
get key [NX/UX]
NX:不覆盖,不存在就自动创建
XX:覆盖已存在,不存在时不会自动创建
取值后赋值
getset key value
该指令会返回原来key的值。
批量赋值和取值
mset key1 value1 key2 value2 key3 value3…
mget key1 key2 key3
判断字段是否存在
exists key
递增/递减
incr/decr key
该指令使用默认步长(1或-1)进行递增和递减
incrby/decrby key increment/decrement
该指令可指定步长
获取字符串
strlen key
该指令返回字符串长度。
getrange key start end
该指令获取指定范围的字符,可以将end设置为-1,表示获取字符串第start个到最后一个字符。
setrange key start end
该指令用于覆盖原来的字符串,从指定位置开始覆盖
append key value
删除字段
del key1 key2 key3…
可以使用散列存储对象。
Redis中的列表类似于数据结构中的双向链表实现的队列,既可以从两端取元素又可以从两端存元素,并且每个元素还有索引(序号),大大加快了获取指定索引元素的速度。
位图是Redis中特别有意思的一种数据结构,它使用二进制数表示数据,常常用于签到次数、点击次数等应用场景中。下图显示了“A”与“a”两个字符的unicode编码和十进制数,接下来在Redis客户端中进行验证。
依次取出key1的前8位数值,发现前8位数值与对应unicode编码相同。
接着将key1的第3位值由0改为1(系统返回值为该位置原来的值),再取出key1,发现key1由“A”变成了“a”。
Jedis是Java开发中使用最广泛的Redis客户端库之一,它封装了大多数Redis的操作指令,让Java与Redis的交互变得容易。后续操作均借助Jedis完成。
public static Jedis getRedisConnection(){
Jedis jedis = new Jedis("localhost",6379);
return jedis;
}
public static void setAndGet(){
Jedis connection = new Jedis("localhost",6379);
connection.set("hello", "redis");
System.out.println(connection.get("hello"));
String oldValue = connection.getSet("hello", "jedis");
System.out.println(oldValue);
System.out.println(connection.get("hello"));
connection.close();
}
//截取字符串 public static void subString(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); System.out.println(connection.strlen("hello")); System.out.println(connection.getrange("hello", 1, 3)); connection.close(); } //向末尾添加字符串 public static void appendString(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); System.out.println(connection.append("hello", " 123")); System.out.println(connection.get("hello")); connection.close(); }
如前言中所述,Redis是一款基于内存的数据库,当数据量足够庞大时必然影响系统的运行速度,所有为“键”设置过期时间(Time To Live)十分有必要。
//设置键的过期时间 public static void setExpire(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); //expire中传入的时间单位为“秒” connection.expire("hello", 1); try { //Thread中传入的时间单位是“毫秒” Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(connection.get("hello")); /* 用于显示键的过期时间 -1表示键存在但未设置过期时间,意味着永久存在 -2表示键不存在 整数n表示当前键剩余过期时间 */ System.out.println(connection.ttl("hello")); connection.close(); }
public static void setAndGetHash(){
Jedis connection = new Jedis("localhost", 6379);
connection.hset("car", "color", "white");
HashMap<String, String> carMap = new HashMap<>();
carMap.put("brand", "BMW");
carMap.put("price", "500");
connection.hmset("car", carMap);
System.out.println(connection.hgetAll("car"));
connection.close();
}
public static void incrementDecrement(){
Jedis connection = new Jedis("localhost", 6379);
System.out.println(connection.hgetAll("car"));
connection.hincrBy("car", "price", 500);
System.out.println(connection.hgetAll("car"));
connection.close();
}
//获取所有的键和值
public static void getAllKeysAndValues(){
Jedis connection = new Jedis("localhost", 6379);
Set<String> keys = connection.hkeys("car");
for (String key : keys) {
System.out.println(key);
}
List<String> values = connection.hvals("car");
for (String value : values) {
System.out.println(value);
}
connection.close();
}
//列表操作之存取数据
public static void listPushAndPop(){
Jedis connection = new Jedis("localhost", 6379);
connection.lpush("fruit","apple","banana");
connection.rpush("fruit", "orange","grape", "pear");
//获取列表fruit的长度并输出其中的内容
while (connection.llen("fruit") > 0){
System.out.println(connection.lpop("fruit"));
}
connection.close();
}
//获取列表中指定位置的元素
public static void getListIndex(){
Jedis connection = new Jedis("localhost", 6379);
connection.rpush("fruit", "apple","banana","orange","grape","pear");
System.out.println(connection.lindex("fruit", 1));
//此处分隔表示和后面结果相区分
System.out.println("*************");
List<String> fruits = connection.lrange("fruit", 2, 4);
for (String fruit : fruits) {
System.out.println(fruit);
}
connection.close();
}
//删除列表中指定元素
public static void removeListValue(){
Jedis connection = new Jedis("localhost", 6379);
connection.lpush("list","a","b","c","a","a","d");
//从左往右删除列表中的两个a
connection.lrem("list", 2, "a");
//通常情况下-1表示数据结构的最后一个元素
List<String> list = connection.lrange("list", 0, -1);
for (String s : list) {
System.out.println(s);
}
connection.close();
}
//集合操作之存取数据 public static void addAndRemoveValue(){ Jedis connection = new Jedis("localhost", 6379); connection.sadd("set","a","b","c","a","a","d"); System.out.println("删除前的元素:"); Set<String> set = connection.smembers("set"); for (String s : set) { System.out.println(s); } System.out.println("删除后的元素"); connection.srem("set", "a"); set = connection.smembers("set"); for (String s : set) { System.out.println(s); } connection.close(); }
//集合的运算 public static void setOperation(){ Jedis connection = new Jedis("localhost", 6379); //删除redis所有的键值对 connection.flushAll(); connection.sadd("fruit", "apple","tomato"); connection.sadd("vegetable", "tomato","potato", "carrot"); //求集合的交集 Set<String> sinter = connection.sinter("fruit", "vegetable"); System.out.println("交集是:"); for (String s:sinter){ System.out.println(s); } //求集合的并集 Set<String> sunion = connection.sunion("fruit", "vegetable"); System.out.println("\n并集是:"); for (String s:sunion){ System.out.println(s); } //求集合的差集fruit减去vegetable Set<String> sdiff = connection.sdiff("fruit", "vegetable"); System.out.println("\n差集是:"); for (String s:sdiff){ System.out.println(s); } connection.close(); }
import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.List; import java.util.Set; public class RedisUtil { public static void main(String[] args) { } public static Jedis getRedisConnection(){ Jedis jedis = new Jedis("localhost",6379); return jedis; } //设置、获取字符串的键值 public static void setAndGet(){ Jedis connection = new Jedis("localhost",6379); connection.set("hello", "redis"); System.out.println(connection.get("hello")); String oldValue = connection.getSet("hello", "jedis"); System.out.println(oldValue); System.out.println(connection.get("hello")); connection.close(); } //截取字符串 public static void subString(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); System.out.println(connection.strlen("hello")); System.out.println(connection.getrange("hello", 1, 3)); connection.close(); } //向末尾添加字符串 public static void appendString(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); System.out.println(connection.append("hello", " 123")); System.out.println(connection.get("hello")); connection.close(); } //设置键的过期时间 public static void setExpire(){ Jedis connection = new Jedis("localhost", 6379); connection.set("hello", "redis"); connection.expire("hello", 1); try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(connection.get("hello")); /* 用于显示键的过期时间 -1表示键存在但未设置过期时间,意味着永久存在 -2表示键不存在 整数n表示当前键剩余过期时间 */ System.out.println(connection.ttl("hello")); connection.close(); } //散列的赋值与取值 public static void setAndGetHash(){ Jedis connection = new Jedis("localhost", 6379); connection.hset("car", "color", "white"); HashMap<String, String> carMap = new HashMap<>(); carMap.put("brand", "BMW"); carMap.put("price", "500"); connection.hmset("car", carMap); System.out.println(connection.hgetAll("car")); connection.close(); } //递增递减操作 public static void incrementDecrement(){ Jedis connection = new Jedis("localhost", 6379); System.out.println(connection.hgetAll("car")); connection.hincrBy("car", "price", 500); System.out.println(connection.hgetAll("car")); connection.close(); } //获取所有的键和值 public static void getAllKeysAndValues(){ Jedis connection = new Jedis("localhost", 6379); Set<String> keys = connection.hkeys("car"); for (String key : keys) { System.out.println(key); } List<String> values = connection.hvals("car"); for (String value : values) { System.out.println(value); } connection.close(); } //列表操作之存取数据 public static void listPushAndPop(){ Jedis connection = new Jedis("localhost", 6379); connection.lpush("fruit","apple","banana"); connection.rpush("fruit", "orange","grape", "pear"); //获取列表fruit的长度并输出其中的内容 while (connection.llen("fruit") > 0){ System.out.println(connection.lpop("fruit")); } connection.close(); } //获取列表中指定位置的元素 public static void getListIndex(){ Jedis connection = new Jedis("localhost", 6379); connection.rpush("fruit", "apple","banana","orange","grape","pear"); System.out.println(connection.lindex("fruit", 1)); //此处分隔表示和后面结果相区分 System.out.println("*************"); List<String> fruits = connection.lrange("fruit", 2, 4); for (String fruit : fruits) { System.out.println(fruit); } connection.close(); } //删除列表中指定元素 public static void removeListValue(){ Jedis connection = new Jedis("localhost", 6379); connection.lpush("list","a","b","c","a","a","d"); //从左往右删除列表中的两个a connection.lrem("list", 2, "a"); //通常情况下-1表示数据结构的最后一个元素 List<String> list = connection.lrange("list", 0, -1); for (String s : list) { System.out.println(s); } connection.close(); } //集合操作之存取数据 public static void addAndRemoveValue(){ Jedis connection = new Jedis("localhost", 6379); connection.sadd("set","a","b","c","a","a","d"); System.out.println("删除前的元素:"); Set<String> set = connection.smembers("set"); for (String s : set) { System.out.println(s); } System.out.println("删除后的元素"); connection.srem("set", "a"); set = connection.smembers("set"); for (String s : set) { System.out.println(s); } connection.close(); } //集合的运算 public static void setOperation(){ Jedis connection = new Jedis("localhost", 6379); //删除redis所有的键值对 connection.flushAll(); connection.sadd("fruit", "apple","tomato"); connection.sadd("vegetable", "tomato","potato", "carrot"); //求集合的交集 Set<String> sinter = connection.sinter("fruit", "vegetable"); System.out.println("交集是:"); for (String s:sinter){ System.out.println(s); } //求集合的并集 Set<String> sunion = connection.sunion("fruit", "vegetable"); System.out.println("\n并集是:"); for (String s:sunion){ System.out.println(s); } //求集合的差集fruit减去vegetable Set<String> sdiff = connection.sdiff("fruit", "vegetable"); System.out.println("\n差集是:"); for (String s:sdiff){ System.out.println(s); } connection.close(); } }
测试工具为Junit5,开发环境为IDEA,在Eclipse中测试方法必须以test开头,此处与IDEA有所区别。
import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; import static org.junit.jupiter.api.Assertions.*; class RedisUtilTest { @Test void getRedisConnection() { Jedis connection = RedisUtil.getRedisConnection(); System.out.println(connection); connection.close(); } @Test void setAndGet() { RedisUtil.setAndGet(); } @Test void subString() { RedisUtil.subString(); } @Test void appendString() { RedisUtil.appendString(); } @Test void setExpire() { RedisUtil.setExpire(); } @Test void setAndGetHash() { RedisUtil.setAndGetHash(); } @Test void incrementDecrement() { RedisUtil.incrementDecrement(); } @Test void getAllKeysAndValues() { RedisUtil.getAllKeysAndValues(); } @Test void listPushAndPop() { RedisUtil.listPushAndPop(); } @Test void getListIndex() { RedisUtil.getListIndex(); } @Test void removeListValue() { RedisUtil.removeListValue(); } @Test void addAndRemoveValue() { RedisUtil.addAndRemoveValue(); } @Test void setOperation() { RedisUtil.setOperation(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。