Redis 全称 REmote DIctionary Service
定义:
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
实际上是为了解决磁盘的性能问题,所以它是一个以key-value的字典结构存储方式,其中key-value的key最大值为512M
默认有16个库(0-15),可以在配置文件中修改,默认使用第一个db0。
默认端口 6379 如果需要上线项目,需要切换端口,防止黑客攻击。
databases 16因为没有完全隔离,不像数据库的database,不适合把不同的库分配给不同的业务使用。
使用指令redis-cli -p 端口
进入操作
1、切换数据库 select 0
2、清空当前数据库 flushdb
3、存值 set test 0
4、取值 get test
5、查看所有的键 keys *
6、获取键总数 dbsize
7、查看键是否存在 exists test
8、删除键 del test
9、重命名键 rename test test1
10、查看类型 type test
可以用来存储字符串、整数、浮点数。 基本指令
批量设置 mset test 1 test1 0
批量获取 mget test test1
获取长度 strlen test
字符串追求内容 append test good
(整数)值递增 incr intkey incrby intkey 100
(浮点数)值递增 set f 2.5 incrbyfloat f 1.5
分布式锁 setnx y 1
应用场景: 计数器、限流、缓存、分布式锁
JAVA代码实践
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i <5 ; i++) {
JedisUtil.getJedisUtil().incr("test"+i);
}
List<String> List=JedisUtil.getJedisUtil().mget("test1","test2");
for (String s:List) {
System.out.println(s);
}
}
> 输出:
> 1
> 1
分布式锁:
for (int i = 0; i < 2; i++) {
new Thread(){
public void run() {
try {
long exit=JedisUtil.getJedisUtil().setnx("lock","1");
if (exit==0)
{
System.out.println("被锁住了,不能执行");
}else
{
JedisUtil.getJedisUtil().expire("lock",30);
System.out.println("处理业务中");
Thread.sleep(3000);
}
}catch (Exception ex)
{
JedisUtil.getJedisUtil().del("lock");
}
};
}.start();
}
> 输出
> 处理业务中
> 被锁住了,不能执行
设置 hset value
获取 hget key value
批量获取 hmget key value value
应用场景: 管理购物车、String可以做的事情
java实践:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
JedisUtil.getJedisUtil().hset("hhh", "10", "1");
JedisUtil.getJedisUtil().hincrby("hhh", "10", 2L);
JedisUtil.getJedisUtil().hset("hhh", "11", "1");
map = JedisUtil.getJedisUtil().hgetall("18");
System.out.println(map.toString());
JedisUtil.getJedisUtil().hdel("18", "11");
map = JedisUtil.getJedisUtil().hgetall("18");
System.out.println(map.toString());
}
> 输出:
> {11=1,10=3}
> {10=3}
左右添加元素 lpush test b c
rpush test d e
左右弹出第一条 lpop test
rpop test
左右弹出第一条,并设置超时,
直到有数据弹出或者超时 blpop test 10
brpop test 10
取值
lindex test 0
取第一个
lrange test 0 -1
取所有
应用场景:消息队列
JAVA实践
public static void main(String[] args) {
// JedisUtil.getJedisUtil().lpush("queue","1");
JedisUtil.getJedisUtil().lpush("msgList","第一条消息");
JedisUtil.getJedisUtil().lpush("msgList","第二条消息");
JedisUtil.getJedisUtil().lpush("msgList","第三条消息");
//左边进左边出(先进后出)最新的在最上面
for (int i = 0; i < 3; i++) {
System.out.println(JedisUtil.getJedisUtil().rpop("msgList"));
}
}
> 输出
> 第一条消息
> 第二条消息
> 第三条消息
String 类型的无序集合。
基本指令 sadd test a b c d e f g
获取所有元素 smembers test
获取所有元素的个数 scard test
随机获取一个元素 srandmember test
随机弹出一个元素 spop test
弹出指定元素 srem test g a
查看元素是否存在 sismember test
获取前一个集合有而后面1个集合没有的 sdiff test test1
获取交集 sinter test test1
获取并集 sunion test test1
使用场景:1、抽奖。 2.点赞、签到等。 3、交集并集 可能认识的人,关注等场景
JAVA实现抽奖
public static void main(String[] args) {
JedisUtil.getJedisUtil().sadd("jiangpin","csdn1","csdn2","csdn3","csdn4","csdn5","csdn6","csdn7","csdn8","csdn9","csdn10");
//抽奖,三等奖3个,二等2个,一等奖1个,被抽中的自动从奖池移除
List<String> thirdPrizeList=new ArrayList<>();
thirdPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
thirdPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
thirdPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
System.out.println("三等奖:"+thirdPrizeList.toString());
//二等奖
List<String> secondPrizeList=new ArrayList<>();
secondPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
secondPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
System.out.println("二等奖:"+secondPrizeList.toString());
//一等奖
List<String> firstPrizeList=new ArrayList<>();
firstPrizeList.add(JedisUtil.getJedisUtil().spop("jiangpin"));
System.out.println("一等奖:"+firstPrizeList.toString());
}
sorted set,有序的set,每个元素有个score。 score相同时,按照key的ASCII码排序。
基本指令
批量添加 zadd hhh 10 ch1 20 ch2 30 ch3 40 ch4
根据分数从低到高 zrange hhh 0 -1 withscores
根据分数从高到低 zrevrange hhh 0 -1 withscores
根据分数范围获取值 zrangebyscore hhh 20 30
移除元素 zrem hhh ch1
获取zset个数 zcard hhh
给某个元素加分 zincrby hhh 50 ch1
获取范围内的个数 zcount hhh 10 60
返回指定元素的索引 zrank hhh ch2
使用场景:排行榜
JAVA实践
public static void main(String[] args) {
// 运动会排名赛
JedisUtil.getJedisUtil().zadd("sport", 10, "张三");
JedisUtil.getJedisUtil().zadd("sport", 10, "李四");
JedisUtil.getJedisUtil().zadd("sport", 10, "王五");
//张三跑200米第一名,加10分
JedisUtil.getJedisUtil().zincrby("sport",10,"张三");
//李四长得不错,而且跳高第一
JedisUtil.getJedisUtil().zincrby("sport",20,"李四");
//王五跑步绊倒别人扣10分
JedisUtil.getJedisUtil().zincrby("sport",-10,"王五");
//王五不道歉,删除名单,提出运动会场
JedisUtil.getJedisUtil().zrem("sport","王五");
Set<String> set = JedisUtil.getJedisUtil().zrevrange("huihuiCompany", 0, -1);
System.out.println("分数从高到低:"+set);// 从高到低
//获取前2名
Set<String> setTop3 = JedisUtil.getJedisUtil().zrevrange("huihuiCompany", 0, 2);
System.out.println("前两名:"+setTop3);
}
> 输出
> 分数从高到底:[李四,张三]
> 前两名:[李四,张三]