目录
1. Redis五大常用数据类型
1.1 键(key)
- keys * 查看当前库的所有key
- exists key 查看key是否存在
- del key 删除key
- expire key 给key设置过期时间
- ttl key 查看key还有多少秒过期(返回-1永不过期 返回-2已经过期)
- dbsize 查看当前数据库key的数量
- flushdb 清空当前数据库
- flushall 清空所有数据库
1.2 字符串(String)
1.2.1 常用命令
- set key value 设置键值対
- setnx key value 只能设置不存在的key
- get key 获取值
- append key value 添加值到对应key的值的末尾
- strlen key 获得值的长度
- incr key 将key中值加1,;只能对数字进行操作,key不存在,默认值为1
- decr key 将key中值减1,;只能对数字进行操作,key不存在,默认值为-1
- incrby key 数字 增加指定数值
- decrby key 数字 减少指定数值
- mset key1 value1 key2 value2… 设置多个键值対
- mget key1 key2… 获取多个值
- msetnx key1 value1 key2 value2…只能设置不存在的键值対
- setrange start end 获取开始到结束位置的值
- getrange key start value 使用value去替代开始位置的字符串
- setex 在设置键值対的时候就设置过期时间
- getset key value 在获取旧值的时候用新值替换掉旧值
1.2.2 数据结构
String的数据结构为简单动态字符串,是可以修改的字符串。
字符串长度小于1M时,扩容都是对当前容量的翻倍。
当字符串长度大于M时,扩容是增加1M的空间。最大长度为512M。
1.3 列表(List)
1.3.1 常用命令
- lpush/rpush key value1 value2 从左/又依次插入值
- lpop/rpop key 从左/右取出一个值 (key中值取完就key没了)
- lrange key start end 获取开始到结束位置的值 左→右(0 -1 取全部值)
- rpoplpush key1 key2 取出key1右边的一个值插入到key2的左边
- lindex key index 按照索引值获取value
- llen key 获取列表长度
1.3.2 数据结构
List的数据结构为快速列表,是可以修改的字符串。
列表元素较少的时候使用一块连续的内存存储,是压缩列表。
当数据量较多的时候就会使用快速列表。
1.4 集合(Set)
1.4.1 常用命令
- sadd key value value 往key中添加值
- smembers key 查看key中所有值
- sismembers key value 查看key中是否有对应值
- scard key 查看key中值的个数
- spop key count 从key中随机吐出count个值
- smove key1 key2 value 将key1中的值移动到key2中
- sinter key1 key2 取交集
- sunion key1 key2 取并集
- sdiff key1 key2 取差集(留key1中)
1.4.2 数据结构
Set的数据结构为字典,字典是使用哈希表实现的。
无序且不重复。
1.5 哈希(hash)
1.5.1 常用命令
-
hset key filed value 给key集合中的filed键添加值
-
hget key filed 从key集合中的filed键取出值
-
hkeys key 查看key集合中的所有filed键
-
hvals key 查看key集合中的所有value值
-
hincrby key filed 数值 为key集合的filed中的值加上数值
1.5.2 数据结构
hash的数据结构为压缩列表和哈希表两种。
当filed-value长度较短且个数较少是,使用压缩列表,否则使用哈希表。
1.6 有序集合(Zset)
1.6.1 常用命令
-
zadd key score value score value… 将一个或多个值以及评分加入集合中
-
zrange key start end 查看范围在start到end的值
-
zrangebyscore key min max 查看分数在min到max的值
-
zincrby key 数值 value 为指定value加上数值
-
count key min max 统计key中分数在min到max的值的个数
-
zrank key value 查看value在集合中的排名
1.6.2 数据结构
zset的数据结构为跳跃表和哈希表。
哈希表的作用就是关联元素value和权重score。
跳跃表的作用是给元素value排序,能通过score的范围获取元素列表。
2. Redis发布和订阅
2.1 什么是发布和订阅
Redis发布和订阅(pub/sub)是一种消息通信模式:发送者发送消息,订阅者接受消息。
Redis可以订阅任意数量频道。
2.2 命令实例
- 创建两个客户端
- 第一个客户端先订阅频道1
subscribe channel1
- 第二个客户端在频道1发布 HelloWorld!的消息,第一个客户端接受到第二个客户端发送的 HelloWorld!消息。
publish channel1 HelloWorld!
3. Jedis测试
3.1 连接测试
windows连接主机地址填写127.0.0.1就行
linux连接填写linux主机地址,可以通过ipconfig查看,然后需要在配置文件中将将127.0.0.1注释掉,不注释掉只能接受本机访问,然后将安全模式设置为no,最后在查看一下防火墙是否开启6379端口号。
返回PONG则代表连接成功
public static void main(String[] args) {
//创建Jedis对象
Jedis jedis = new Jedis("127.0.0.1",6379);
//测试
String ping = jedis.ping();
System.out.println(ping);//PONG
}
3.2 五种不同数据类型测试
- 导入所需依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
- 测试
//String
@Test
public static void demo1(Jedis jedis){
jedis.set("k1", "v1");
String string = jedis.get("k1");
System.out.println("string中的值为:"+string);//string中的值为:v1
}
//List
@Test
public static void demo2(Jedis jedis){
jedis.lpush("k2", "v1", "v2", "v2");
List<String> list = jedis.lrange("k2", 0, -1);
System.out.println("list中的值为:"+list);//list中的值为:[v2, v2, v1]
}
//Set
@Test
public static void demo3(Jedis jedis){
jedis.sadd("k3","v1","v2","v2");
Set<String> set = jedis.smembers("k3");
System.out.println("set中的值为:"+set);//set中的值为:[v1, v2]
}
//Hash
@Test
public static void demo4(Jedis jedis){
jedis.hset("k4","id","1");
jedis.hset("k4","name","zhangsan");
Map<String, String> hash = jedis.hgetAll("k4");
System.out.println("hash中的值为:"+hash);//hash中的值为:{name=zhangsan, id=1}
}
//Zset
@Test
public static void demo5(Jedis jedis){
jedis.zadd("k5",10,"python");
jedis.zadd("k5",20,"java");
Set<String> zset = jedis.zrange("k5", 0, -1);
System.out.println("zset中的值为:"+zset);//zset中的值为:[python, java]
}
3.3 Jedis实例
public class JedisPhone01 {
public static void main(String[] args) {
//输入电话号码
//setRedis("13812345678");
//验证码校验
codeCheck("13812345678","048037");
}
//验证码校验,返回成功或者失败
public static void codeCheck(String phone,String code){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.select(1);
String codeKey = phone+":code";
String vcode = jedis.get(codeKey);
if (vcode.equals(code)){
System.out.println("验证成功");
}else {
System.out.println("验证失败");
}
jedis.close();
}
//手机号每天只能输入3次,将6位验证码存入redis并且设置2分钟有效
public static void setRedis(String phone){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.select(1);
//设置手机号输入次数和验证码的key
String countKey = phone+":count";
String codeKey = phone+":code";
//判断输入次数
String count = jedis.get(countKey);
if(count == null){//如果次数为空,代表这是第一次输入,设置输入次数为1
jedis.setex(countKey,24*60*60,"1");
}else if(Integer.parseInt(count)<=2){
jedis.incr(countKey);
}else {
System.out.println("每天只能输入3次");
jedis.close();
return;
}
//将6位验证码存入redis并且设置2分钟有效
String code = getCode();
jedis.setex(codeKey,120,code);
jedis.close();
}
//随机生成6位验证码
public static String getCode(){
String code = "";
for (int i = 0; i < 6; i++) {
Random random = new Random();
int num = random.nextInt(10);
code+=num;
}
return code;
}
}