Redis入门
文章目录
概述
🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣
首先数据库分为关系型和非关系型的数据库
关系型:Mysql
非关系型:Redis
Redis是一个开源的,C语言进行编写的非关系型数据库,他将数据存储在内存中,对于数据的读取速度很快,处理高并发非常方便
Redis的优势
-
Redis采用键值对的方式进行数据的存储,解决了传统的关系型数据库对于高并发处理的缺陷,能够快速、完美地解决高并发问题
-
它的数据保存在内存中,存取速度快
-
支持的存储方式有很多类型,例如String、List、Set、ZSet和Hash
-
Redis支持集群
-
支持持久化,可以把内存中的数据持久化到磁盘上面
-
支持订阅和发布功能
Redis的使用场景
Redis的使用场景包括但不仅限于以下方面
中央缓存
作为计数器来使用
实时攻击防护(防暴力破解)
设置有效期
队列功能(秒杀)
消息订阅系统
Redis常用命令
对Key的常用操作
- key *:获取所有的key
- del key:删除key
- expire key xx:设置key的过期时间(xx秒后过期)
- ttl key:查看key的过期时间
- flushall:清空整个redis服务器中的数据
- flushdb:清空当前数据库中的所有数据(redis默认16个数据库)
- select xx:选择xx数据库
String型
- set key value:设置相应的key和value
- get key:获取相关key的value值
- mset:同时设置多对key和value
- mget:同时获取多对key和value
- incr key:将key中存储的数字值+1(注意:必须是数值型)
- decr key:将key中存储的数字值+1(注意:必须是数值型)
- incrby key:设置自增多少
- decrby key:设置自减多少
List型
List集合是一个有序可重复的队列
- lpush key value:将一个或多个值从左到右插入到list集合中
- rpush key value:将一个或多个值从右到左插入到list集合中
- lpop key:从左边开始移除key值
- rpop key:从右边开始移除key值
- lrange key start stop:返回指定长度的元素(lrange key 0 -1代表返回全部元素)
- lrem key count value:根据count值移除列表key中于参数value相等的元素 (count>0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值)
- inedx key index:返回下标为index的元素
- itrim key start stop:对一个列表进行截取,从start开始,stop结束
Set型
Set集合是一个无序不重复的队列,能够自动去重
- sadd key member:将一个或多个member元素加入到set集合中,拥有自动去重功能
- srem key member:移除集合中的一个或多个元素
- smember key:返回集合key中的所有成员
🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣
Hash型
- hset key name value:添加一个name和value键值对到key这个hash类型
- hget key name:获取hash类型的name键对应的值
- hmset 大key name1 小key name2 小key:添加多个name和key保存到大key中
- hmget key name1 name2:批量获取hash类型的键对应的值
- hkeys:返回哈希表 key 中的所有键
- hvals:返回哈希表 key 中的所有的value值
- hgetall:返回哈希表 key 中,所有的键和值
事务
在Redis中的事务是弱事务,失败并不会回滚,有点多余
- multi:标记一个事务块的开始
- exec:执行所有事务块内的命令
- discard:取消事务,放弃执行事务块内的所有命令
订阅/广播
- SUBSCRIBE channel [channel …]:订阅给定的一个或多个频道的信息。
- PUBLISH channel message:将信息message发送到指定的频道channel
Java操作Redis
创建一个普通java项目
导包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ExBMHcU5-1574164199044)(images/M2hEWj.png)]
配置连接池
新封装一个工具类,方便以后获取Jedis
package com.ifueen.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 连接连接池的工具类
*/
public class JedisUtil {
private static JedisPool jedisPool = null;
static {
//创建JedisPool配置对象
JedisPoolConfig config = new JedisPoolConfig();
//配置
config.setMaxIdle(2);
config.setMaxTotal(10);
config.setMaxWaitMillis(1*3000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
//配置jedisPool
jedisPool = new JedisPool(config,"127.0.0.1",6379,1*1000,"123456");
}
/**
* 返回jedis对象
* @return
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
/**
* 关闭连接池
*/
public static void close(){
jedisPool.destroy();
}
}
测试
package com.ifueen.redis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 测试jedis
*/
public class JedisTest {
//获取到jedis
Jedis jedis = JedisUtil.getJedis();
/**
* 测试String型
*/
@Test
public void testString(){
//设置单个String的健值
jedis.set("name","fueen");
String name = jedis.get("name");
System.out.println(name);
//给多个set赋值
jedis.mset("username","fueen","age","18","speak","山泥若");
List<String> mget = jedis.mget("username", "age", "speak");
mget.forEach(m->{
System.out.println(m);
});
//让key自增
Long age = jedis.incr("age");
System.out.println(age);
//自减多少
Long decrBy = jedis.decrBy("age", 5);
System.out.println(decrBy);
//关闭jedis
jedis.close();
JedisUtil.close();
}
/**
* 对Key的测试
*/
@Test
public void testKey() throws Exception {
//获取所有的key
Set<String> keys = jedis.keys("*");
System.out.println(keys);
//删除key
jedis.del("age1");
Set<String> keys1 = jedis.keys("*");
System.out.println(keys1);
//设置key的过期时间
jedis.expire("age",30);
//查看key的过期时间
Long age = jedis.ttl("age");
System.out.println(age);
//清空所有数据库的数据,直接清空整个redis
jedis.flushAll();
Set<String> keys2 = jedis.keys("*");
System.out.println(keys2);
//清空当前库
jedis.flushDB();
Set<String> keys3 = jedis.keys("*");
System.out.println(keys3);
//选择数据库
jedis.select(5);
jedis.close();
JedisUtil.close();
}
/**
* 对List集合的操作
*/
@Test
public void testList(){
//从左到右将值插到list中去
jedis.lpush("name","fueen","山泥若","电棍","落日飞车","李志");
//查询list集合中的值
List<String> name = jedis.lrange("name", 0, -1);
System.out.println(name);
//从右到左将值插到list中
jedis.rpush("speak","希望我们大家开心","你没事吧?兄弟",
"这打野的走位我就觉得你妈逼离谱","MyJnin","妈妈,他们抛弃了我");
List<String> name1 = jedis.lrange("speak", 0, -1);
System.out.println(name1);
//移除并返回列表 key 的头(最左边)元素
String name2 = jedis.lpop("name");
System.out.println(name2);
//移除并返回列表key的最右边元素
String speak = jedis.rpop("speak");
System.out.println(speak);
List<String> name3 = jedis.lrange("name", 0, -1);
System.out.println(name);
List<String> name4 = jedis.lrange("speak", 0, -1);
System.out.println(name4);
//根据count值(第二个参数)移除列表key中与参数 value(第三个参数) 相等的元素
jedis.lrem("name",0,"山泥若");
List<String> name5 = jedis.lrange("name", 0, -1);
System.out.println(name5);
//对一个列表进行修剪
jedis.ltrim("speak",0,2);
//排序
jedis.lpush("num","15","56","19","70");
System.out.println("原始值:"+jedis.lrange("num",0,-1));
System.out.println("排序后的值:"+jedis.sort("num"));
jedis.close();
JedisUtil.close();
}
/**
* 对Set集合进行操作
*/
@Test
public void testSet(){
//添加元素到set中
jedis.sadd("person","fueen","李志","万青","痛仰","窦唯");
//查看所有成员
Set<String> person = jedis.smembers("person");
System.out.println(person);
//删除
jedis.srem("person","痛仰");
//查看所有成员
Set<String> person1 = jedis.smembers("person");
System.out.println(person1);
//获得两个集合的交集
jedis.sadd("persons","fueen","这个世界会好吗","秦皇岛","再见杰克","高级动物");
Set<String> sinter = jedis.sinter("person", "persons");
System.out.println(sinter);
//将交集保存到一个新的集合中
jedis.sinterstore("personts","person","persons");
Set<String> person2 = jedis.smembers("personts");
System.out.println(person2);
//获取并集
Set<String> sunion = jedis.sunion("person", "persons");
System.out.println(sunion);
//将并集保存到一个新的set中
jedis.sunionstore("personc","person","persons");
Set<String> person3 = jedis.smembers("personc");
System.out.println(person3);
//差集
Set<String> sdiff = jedis.sdiff("person", "persons");
System.out.println(sdiff);
//将差集保存到新的set中
jedis.sdiffstore("persont","person","persons");
Set<String> person4 = jedis.smembers("personc");
System.out.println(person4);
jedis.close();
JedisUtil.close();
}
/**
* 对Hash的操作
*/
@Test
public void testHash(){
//设置值
jedis.hset("user", "name","向阳花");
//获取所有
Map<String, String> user = jedis.hgetAll("user");
System.out.println(user);
//删除
jedis.hdel("user","name");
jedis.hset("ccc","age","15");
//自增
jedis.hincrBy("ccc","age",2);
Map<String, String> ccc = jedis.hgetAll("ccc");
System.out.println(ccc);
//新增多个成员
jedis.hmget("user", "name","向阳花","age","20","speak","会不会害怕");
//查询所有的key
Set<String> user1 = jedis.hkeys("user");
System.out.println(user1);
//查询所有的value
List<String> user2 = jedis.hvals("user");
System.out.println(user2);
jedis.close();
JedisUtil.close();
}
/**
* 测试排序
*/
@Test
public void testJedis(){
jedis.lpush("num","15","56","19","70");
System.out.println("原始值:"+jedis.lrange("num",0,-1));
System.out.println("排序后的值:"+jedis.sort("num"));
SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
System.out.println("排序后:"+jedis.sort("langues",sortingParams));
jedis.close();
JedisUtil.close();
}
/**
* 测试事务
*/
@Test
public void testTransation(){
jedis.set("name","fueen");
jedis.set("age","20");
System.out.println(jedis.mget("name","age"));
//开启事务
Transaction multi = jedis.multi();
//自增
multi.incr("name");
multi.incr("age");
//提交事务
List<Object> exec = multi.exec();
System.out.println(exec);
System.out.println(jedis.mget("name","age"));
jedis.close();
JedisUtil.close();
}
}