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

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

redis安装

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

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

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

redis server启动

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

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

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

redis client启动

执行ping命令,测试是否连接成功,出现如下图所示表示连接成功
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的相关命令以使用语法与含义;

应用场景
  • 分布式锁的实现(简易版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();
    }
}
  • 分布式计数器
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();
    }
}
  • 统计用户一年内的登录情况
# 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
  • 统计近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
  • 统计最近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
应用场景
  • 消息队列:主要是通过blpush+brpop实现;
  • 常用数据结构实现
    • lpush + rpop 实现队列;
    • 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
应用场景
  • 存储对象(object):set user name zhangsan age 13
  • 购物车:
    • 添加到购物车: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
应用场景
  • 微博关注/粉丝列表:sadd follow 1 2 3/ sadd fans 1 2 3
  • 共同关注列表:sinter follow1 follow2
  • 猜你喜欢:sdiff follow1 follow2
  • 随机抽奖: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
应用场景
  • 微博热搜
  • 最新列表

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

你可能感兴趣的:(Redis入门篇-五种基本数据类型及使用场景)