Redis的基本运用笔记

Redis 全称 REmote DIctionary Service
定义:
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
实际上是为了解决磁盘的性能问题,所以它是一个以key-value的字典结构存储方式,其中key-value的key最大值为512M


Redis特性


  1. 速度快
  2. 更丰富的数据类型
  3. 功能丰富:持久化机制、过期策略
  4. 支持多种编程语言
  5. 高可用,集群部署
  6. IO多路复用

Redis基本操作


默认有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

自我实践
Redis的基本运用笔记_第1张图片


Redis五大数据类型


String

可以用来存储字符串、整数、浮点数。 基本指令

批量设置 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

自我实践:
Redis的基本运用笔记_第2张图片

应用场景: 计数器、限流、缓存、分布式锁

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();
        }
        

> 输出
> 处理业务中
> 被锁住了,不能执行

Hash哈希

设置 hset value

获取 hget key value

批量获取 hmget key value value

删除 hdel key value
Redis的基本运用笔记_第3张图片

应用场景: 管理购物车、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}

List列表

左右添加元素 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 取所有
Redis的基本运用笔记_第4张图片

应用场景:消息队列

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"));
        }
    }
    

> 输出
> 第一条消息
> 第二条消息
> 第三条消息

Set集合

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

Redis的基本运用笔记_第5张图片

使用场景: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());
    }

ZSet有序集合

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

获取元素的分数 zscore hhh ch2
Redis的基本运用笔记_第6张图片

使用场景:排行榜

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);

    }
    

> 输出
> 分数从高到底:[李四,张三]
> 前两名:[李四,张三]

你可能感兴趣的:(redis,java)