百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis入门篇-五种基本数据类型及使用场景

mhr18 2024-11-14 16:17 27 浏览 0 评论

前期准备工作(如无需要可直接跳过)

  • redis安装

具体的安装教程可参考之前的章节(https://www.jianshu.com/p/91f90adb782f)

  • 启动redis server(如果没有redis install,可在src目录下找到启动命令)

执行bin/redis-server命令,出现如下图就说明启动成功

bin/redis-server命令后面可以指定redis的配置文件(配置文件中配置了一些参数),具体的配置文件可关注博主,后期会不断更新,共同进步;

  • 启动redis client(如果没有redis install,可在src目录下找到启动命令)

执行bin/redis-cli [-h ip] [-p port],出现如下图所示说明客户端启动并连接成功


执行
ping命令,测试是否连接成功,出现如下图所示表示连接成功

redis的五种类型

  • string:字符串类型
  • list:列表
  • hash:hash,类似于Java中的hashMap数据结构

有序,顺序为插入的顺序

允许重复值

  • set:无序去重列表,与Java中的set类似

无序

对值进行去重

  • zset(sorted set):有序去重列表

结构体中有score的值,会根据这个score的值进行排序

对值进行去重

string

  • 部分基本命令

命令

解释说明

语法

实例

set

给一个key设置string的值

set key value

set k1 v1

mset

set的批量操作

mset key value [key value ...]

mset k1 v1 k2 v2

setex

set增强,添加过期时间

setex key seconds value

setex k1 10 v1

setnx

只有当key不存在的时候才会设置值

setnx key value

setnx k1 v1

setrange

重置指定位置的字符

setrange key offset value

setrange k1 1 v2

get

获取指定key的string值

get key

get k1

append

追加string值到一个key的末尾

append key value

append k1 v2

mget

get的批量操作

mget key [key ...]

mget k1 k2 k3

incr

对int类型的值+1操作

incr key

incr k1

incrby

对int类型的值+整数操作

incrbykey increment

incrby k1 10

incrbyfloat

对int类型的值+浮点数操作

incrbyfloat key increment

incrbyfloat k1 0.5

decr

对int类型的值-1操作

decr key

decr k1

decrby

对int类型的值-整数操作

decrby key decrement

decrby k1 10

decrbyfloat

对int类型的值-浮点数操作

decrbyfloat key decrement

decrbyfloat k1 0.5

提示:可使用help @string查看所有string的相关命令以使用语法与含义;

  • 应用场景

1、分布式锁的实现(简易版jedis)

public class SimpleDistributedLock {
    // treadcount
    private static final int threadCount = 100;
    private static CountDownLatch countDownLatch = new CountDownLatch(threadCount);
    // 1000个库存
    private static int inv = 1;
    // 锁的key
    private static final String lockKey = "distributedLock:simple";
    // 锁超时时间
    private static final long expireSeconds = 10;
    // redisson
    private static RedissonClient redissonClient;
    // redis host
    private static final String redisHost = "127.0.0.1";
    // redis port
    private static final int redisPort = 6379;
    // 初始化连接redis
    static {
        Config config = new Config();
        config.useSingleServer().setAddress(redisHost + ":" + redisPort);
        redissonClient = Redisson.create(config);
    }
    public static void main(String[] args) throws InterruptedException {
        // 模拟并发 扣减库存
        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                RLock lock = redissonClient.getLock(lockKey);
                try {
                    // 设置过期时间 并 加锁(获取锁)
                    lock.lock(expireSeconds, TimeUnit.SECONDS);
                    // 业务 扣减库存
                    if (inv > 0) {
                        inv--;
                    }

                } catch (Exception e) {
                    // 回滚业务操作
                } finally {
                    lock.unlock();
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        System.out.println(inv);
        redissonClient.shutdown();
    }
}

2、分布式计数器

public class Counter {
    private static int count = 0;
    // treadcount
    private static final int threadCount = 100;
    private static CountDownLatch countDownLatch = new CountDownLatch(threadCount);
    // 锁的key
    private static final String lockKey = "distributedLock:simple";
    // 锁超时时间
    private static final long expireSeconds = 10;
    // redisson
    private static RedissonClient redissonClient;
    // redis host
    private static final String redisHost = "127.0.0.1";
    // redis port
    private static final int redisPort = 6379;
    // 初始化连接redis
    static {
        Config config = new Config();
        config.useSingleServer().setAddress(redisHost + ":" + redisPort);
        redissonClient = Redisson.create(config);
    }
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                RLock lock = redissonClient.getLock(lockKey);
                try {
                    lock.lock(expireSeconds, TimeUnit.SECONDS);
                    // 业务操作
                    count++;
                } finally {
                    countDownLatch.countDown();
                    lock.unlock();
                }
            }).start();
        }
        countDownLatch.await();
        System.out.println(count);
        redissonClient.shutdown();
    }
}

3、统计用户一年内的登录情况

# uid为key,每一位代表着一年中的一天
# 2016123240用户在第一天登录过
127.0.0.1:6379> SETBIT uid_2016123240 0 1
(integer) 0
# 2016123240用户在第八天登录过
127.0.0.1:6379> SETBIT uid_2016123240 7 1
(integer) 0
# 2016123240用户在第二十二天登录过
127.0.0.1:6379> SETBIT uid_2016123240 21 1
(integer) 0
# 2016123240用户在第三十一天登录过
127.0.0.1:6379> SETBIT uid_2016123240 30 1
(integer) 0
# 2016123240用户在第五十六天登录过
127.0.0.1:6379> SETBIT uid_2016123240 55 1
(integer) 0
# 2016123240用户在第三百六十六天登录过
127.0.0.1:6379> SETBIT uid_2016123240 365 1
(integer) 0
# 获取2016123240用户在这一年内的登录次数
127.0.0.1:6379> BITCOUNT uid_2016123240 0 -1
(integer) 6

4、统计近7天登录过的用户数

127.0.0.1:6379> SETBIT 20210628 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 3 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 4 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 5 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 9 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 5 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 3 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 10 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210704 1 1
(integer) 0
127.0.0.1:6379> BITOP or orResult 20210628 20210629 20210630 20210701 20210702 20210703 20210704
(integer) 2
127.0.0.1:6379> BITCOUNT orResult 0 -1
(integer) 8

5、统计最近7天连续登录的用户数

127.0.0.1:6379> SETBIT 20210628 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 3 1
(integer) 0
127.0.0.1:6379> SETBIT 20210628 4 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 5 1
(integer) 0
127.0.0.1:6379> SETBIT 20210629 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 9 1
(integer) 0
127.0.0.1:6379> SETBIT 20210630 5 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 3 1
(integer) 0
127.0.0.1:6379> SETBIT 20210701 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210702 10 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 1 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 2 1
(integer) 0
127.0.0.1:6379> SETBIT 20210703 6 1
(integer) 0
127.0.0.1:6379> SETBIT 20210704 1 1
(integer) 0
127.0.0.1:6379> BITOP and andResult 20210628 20210629 20210630 20210701 20210702 20210703 20210704
(integer) 2
127.0.0.1:6379> BITCOUNT andResult 0 -1
(integer) 1

list

  • 部分基本命令

命令

解释说明

语法

实例

lpush

添加一个或者多个值到list中

lpush key value [value ...]

lpush k1 v1 v2

lpop

移除且获取列表中第一个元素

lpop key

lpop k1

llen

获取列表长度

llen key

llen k1

lindex

获取列表中指定index的值

lindex key index

lindex k1 0

linsert

向列表中指定元素前/后插入元素

linsert key before/after pivot value

linsert k1 after v1

lrange

从列表中获取范围的值

lrange key start stop

lrange k1 0 -1

lpushx

如果list存在,则添加一个值到list中

lpushx key value

lpushx k1 v1

lrem

从列表中删除指定个数的指定元素

lrem key count value

lrem k1 2 v1

lset

将列表中指定index的值设置为value

lset key index value

lset k1 1 v1

ltrim

将列表截取指定范围

ltrim key start stop

ltrim k1 1 2

rpush

添加一个或者多个值到list最后中

rpush key value [value ...]

rpush k1 v1 v2

rpop

移除且获取列表中最后一个元素

rpop key

rpop k1

rpushx

如果list存在,则添加一个值到list最后

rpushx key value

rpushx k1 v1

rpoplpush

移除一个列表中的最后一个元素,并将这个元素添加到另一个列表的第一个元素并返回

rpoplpush source destination

rpoplpush k1 k2

blpop

移除且获取第一个元素(阻塞直到元素存在)

BLPOP key [key ...] timeout

blpop k1 10

brpop

移除且获取最后一个元素(阻塞直到元素存在)

BRPOP key [key ...] timeout

brpop k1 10

brpoplpush

移除一个列表中的最后一个元素,并将这个元素添加到另一个列表的第一个元素并返回(阻塞直到元素存在)

brpoplpush source destination timeout

brpoplpush k1 k2 10

  • 应用场景

1、消息队列:主要是通过blpush+brpop实现;

2、常用数据结构实现

3、lpush + rpop 实现队列;

4、lpush + lpop 实现栈;

hash

  • 部分基本命令

命令

解释说明

语法

实例

hget

获取hash的属性的值

hget key field

hget k1 name

hgetall

获取所有的hash的属性和值

hgetall key

hgetall k1

hmget

批量获取hash的属性的值

hmget key field [field ...]

hmget k1 name age

hset

设置hash的指定属性的值

hset key field value

hset k1 name n1

hsetnx

如果不存在,则设置hash的指定属性的值

hsetnx key field value

hsetnx k1 name n1

hmset

批量设置hash的指定属性的值

hmset key field value [field value ...]

hmset k1 name n1 age 18

hdel

删除指定key的属性

hdel key field [field ...]

hdel k1 name age

hkeys

获取key的所有的属性

hkeys key

hkeys k1

hvals

获取key的所有属性的值

hvals key

hvals k1

hstrlen

获取指定key的指定属性的值的长度

hstrlen key field

hstrlen k1 name

hlen

获取指定key的属性个数

hlen key

hlen k1

hincrby

指定key的指定属性值增加整数值

hincrby key field increment

hincrby k1 age 5

hincrbyfloat

指定key的指定属性值增加浮点值

hincrbyfloat key field increment

hincrbyfloat k1 age 5.5

hexists

判断是否存在某一个属性

hexists key field

hexists k1 name

  • 应用场景

1、存储对象(object):set user name zhangsan age 13

2、购物车:

添加到购物车:hset shop_car product_1001 1

增加商品个数:hincrby shop_car product_1001 2

删除商品:hdel shop_car product_1001

计算购物车商品种类数:hlen shop_car

set

  • 部分基本命令

命令

解释说明

语法

实例

sadd

添加一个或多个元素

sadd key member [member ...]

sadd k1 v1 v2 v3

scard

获取set的元素个数

scard key

scard k1

sdiff

差集

sdiff key [key ...]

sdiff k1 k2

sdiffstore

计算差集并将结果存储在另一个key

sdiffstore destination key [key ...]

sdiffstore result k1 k2

sinter

交集

sinter key [key ...]

sinter k1 k2

sinterstore

计算交集并将结果存储在另一个key

sinterstore destination key [key ...]

sinterstore result k1 k2

sismember

判断是否存在值

sismember key member

sismember k1 v1

smembers

获取set的所有值

smember key

smember k1

smove

移动set的指定值到另一个set中

smove source destination member

smove k1 target v1

spop

移除并返回指定个数的数

spop key [count]

spop k1 2

srandmember

获取指定范围的一个或多个值

srandmember key [count]

srandmember k1 2

srem

删除指定值

srem key member [member ...]

srem k1 v1

sscan

迭代

sscan key cursor [MATCH pattern] [COUNT count]

``

sunion

并集

sunion key [key ...]

sunion k1 k2

sunionstore

计算并集并将结果存储到新的set中

sunionstore destination key [key ...]

sunionstore result k1 k2

  • 应用场景

1、微博关注/粉丝列表:sadd follow 1 2 3/ sadd fans 1 2 3

2、共同关注列表:sinter follow1 follow2

3、猜你喜欢:sdiff follow1 follow2

4、随机抽奖:spop award_pool 10

zset

  • 部分基本命令

命令

解释说明

语法

实例

zadd

添加一个或多个元素(带有score)

zadd key score member [score member ...]

zadd k1 1 v1 2 v2

zcard

获取set的元素个数

zcard key

zcard k1

zcount

计算value在min-max中的个数

zcount key min max

zcount k1 1 10

zincrby

指定值增加指定整数值

zincrby key increment member

zincrby k1 10 v1

zinterstore

交集并将结果存储到另一个zset

zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM]

zinterstore result k1 k2

zlexcount

计算zset中score在min-max的值得个数

zlexcount key min max

zlexcount k1 1 10

zpopmax 弹出并返回count个最高分的元素


zpopmax key [count]

zpopmax k1 2

zpopmin 弹出并返回count个最低分的元素


zpopmin key [count]

zpopmin k1 2

zrangebyscore

获取根据分数获取指定范围内的值

zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

zrangebyscore k1 1 10

zrank

获取指定元素的index

zrank key member

zrank k1 v1

zscan

迭代

zscan key cursor [MATCH pattern] [COUNT count]

``

zscore

获取指定值的score

zscore key member

zscore k1 v1

zunionstore

计算并集并将结果存储到另一个zset

zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM]

zset result k1 k2

zrem

删除一个或多个元素

zrem key member [member ...]

zrem k1 v1 v2 v3

  • 应用场景

1、微博热搜

2、最新列表

应用场景实战,后续待更新,如果您觉得有帮助,麻烦点个三连,给个关注。

相关推荐

说说Redis的单线程架构(redis的单线程模型)

一句话总结Redis采用单线程处理命令请求,避免了多线程的上下文切换和锁竞争,保证原子性操作。其基于内存的高效执行和I/O多路复用模型支撑了高并发性能。网络I/O和持久化操作(如RDB/AOF)由后台...

答记者问之 - Redis 的高效架构与应用模式解析

问:极客程序员你好,请帮我讲一讲redis答:redis主要涉及以下核心,我来一一揭幕Redis的高效架构与应用模式解析Redis是一个开源的内存数据存储系统,因其高性能、丰富的数据结构和易用性...

Redis的5种核心数据结构,及其最经典的“应用场景”

Redis凭什么稳坐缓存界头把交椅?全靠这五个“身怀绝技”的数据结构!在分布式系统的江湖里,Redis就像一位身怀绝技的武林高手,而它的五大核心数据结构正是克敌制胜的五套绝学。今天咱们就来拆解这些独门...

精准定位文件包含漏洞:代码审计中的实战思维

前言最近看到由有分析梦想cms的,然后也去搭建了一个环境看了一看,发现了一个文件包含漏洞的点,很有意思,下面是详细的复现和分析,以后代码审计又多了一中挖掘文件包含漏洞的新思路环境搭建下载https...

ARDM:一款国产跨平台的Redis管理工具

ARDM(AnotherRedisDesktopManager)是一款免费开源的Redis桌面管理客户端,支持Windows、Mac、Linux跨平台。功能特性ARDM提供的主要功能如...

SpringBoot的Web应用开发——Web缓存利器Redis的应用!

 Web缓存利器Redis的应用Redis是目前使用非常广泛的开源的内存数据库,是一个高性能的keyvalue数据库,它支持多种数据结构,常用做缓存、消息代理和配置中心。本节将简单介绍Redis的使...

Windows服务器部署CRMEB开源电商系统,详细教程来了!

安装PHP已经安装过PHP的可以跳过首先安装VC运行库下载地址https://docs.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi...

Windows系统下Redis各个安装包介绍与选择指南

简介Redis作为高性能的键值数据库,广泛应用于缓存、消息队列等场景。在Windows系统中部署Redis时,用户可以选择多种安装包以满足不同的需求。本文将详细介绍以下Redis8.0.3版本的安装...

从面试题入手,深度剖析Redis Cluster原理

揭开RedisCluster的神秘面纱**在当今数字化浪潮中,数据量呈爆炸式增长,应用程序对数据存储和处理的要求也日益严苛。Redis作为一款高性能的内存数据库,凭借其出色的读写速度和丰富的数...

给大家推荐些好的c语言代码的网站

C语言,那就来推荐几个吧,部分含有C++:1、TheLinuxKernelArchives(kernel.org)Linux内核源码,仅限于C,但内核庞大,不太适合新手;2、redis(redi...

Redis String 类型的底层实现与性能优化

RedisString是Redis中最基础也是应用最广泛的数据类型,它能存储文本、数字、二进制数据等多种形式的信息。深入理解其底层实现对构建高性能分布式系统至关重要。Redis字符串的底层结...

阿里面试问:Redis 为什么把简单的字符串设计成 SDS?

分享了一道面阿里的redis题,我看了以后觉得挺有意思。题目大致是这样的面试官:了解redis的String数据结构底层实现嘛?铁子:当然知道,是基于SDS实现的面试官:redis是用C语言开发的,那...

编程语言那么多,为何C语言能成为最成功的语言?

编程语言那么多,为何C语言能成为最成功的语言?2025年嵌入式岗位暴增47%,新人却还在问"C语言过时了吗"。真相是连机器人关节驱动都得靠它写,不会指针连芯片手册都看不懂。见过用Pyt...

go-zero 使用 redis 作为 cache 的 2 种姿势

在go-zero框架内,如在rpc的应用service中,其内部已经预置了redis的应用,所以我们只需要在配置中加入相关字段即可,另外,在svcContext声明redisc...

Redis事务深度解析:ACID特性、执行机制与生产实践指南

一、Redis事务的本质与核心机制Redis事务通过MULTI、EXEC、WATCH等命令实现,其本质是将多个命令序列化后一次性执行,而非传统数据库的严格事务模型。核心特点如下:命令队列化:MULT...

取消回复欢迎 发表评论: