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五大数据类型


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

自我实践:
在这里插入图片描述

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

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
在这里插入图片描述

应用场景: 管理购物车、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 取所有
在这里插入图片描述

应用场景:消息队列

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

在这里插入图片描述

使用场景: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
在这里插入图片描述

使用场景:排行榜

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

    }
    

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值