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 valueset k1 v1
msetset的批量操作mset key value [key value ...]mset k1 v1 k2 v2
setexset增强,添加过期时间setex key seconds valuesetex k1 10 v1
setnx只有当key不存在的时候才会设置值setnx key valuesetnx k1 v1
setrange重置指定位置的字符setrange key offset valuesetrange k1 1 v2
get获取指定key的string值get keyget k1
append追加string值到一个key的末尾append key valueappend k1 v2
mgetget的批量操作mget key [key ...]mget k1 k2 k3
incr对int类型的值+1操作incr keyincr k1
incrby对int类型的值+整数操作incrbykey incrementincrby k1 10
incrbyfloat对int类型的值+浮点数操作incrbyfloat key incrementincrbyfloat k1 0.5
decr对int类型的值-1操作decr keydecr k1
decrby对int类型的值-整数操作decrby key decrementdecrby k1 10
decrbyfloat对int类型的值-浮点数操作decrbyfloat key decrementdecrbyfloat 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 keylpop k1
llen获取列表长度llen keyllen k1
lindex获取列表中指定index的值lindex key indexlindex k1 0
linsert向列表中指定元素前/后插入元素linsert key before/after pivot valuelinsert k1 after v1
lrange从列表中获取范围的值lrange key start stoplrange k1 0 -1
lpushx如果list存在,则添加一个值到list中lpushx key valuelpushx k1 v1
lrem从列表中删除指定个数的指定元素lrem key count valuelrem k1 2 v1
lset将列表中指定index的值设置为valuelset key index valuelset k1 1 v1
ltrim将列表截取指定范围ltrim key start stopltrim k1 1 2
rpush添加一个或者多个值到list最后中rpush key value [value ...]rpush k1 v1 v2
rpop移除且获取列表中最后一个元素rpop keyrpop k1
rpushx如果list存在,则添加一个值到list最后rpushx key valuerpushx k1 v1
rpoplpush移除一个列表中的最后一个元素,并将这个元素添加到另一个列表的第一个元素并返回rpoplpush source destinationrpoplpush k1 k2
blpop移除且获取第一个元素(阻塞直到元素存在)BLPOP key [key ...] timeoutblpop k1 10
brpop移除且获取最后一个元素(阻塞直到元素存在)BRPOP key [key ...] timeoutbrpop k1 10
brpoplpush移除一个列表中的最后一个元素,并将这个元素添加到另一个列表的第一个元素并返回(阻塞直到元素存在)brpoplpush source destination timeoutbrpoplpush k1 k2 10
应用场景
  • 消息队列:主要是通过blpush+brpop实现;
  • 常用数据结构实现
    • lpush + rpop 实现队列;
    • lpush + lpop 实现栈;
hash
部分基本命令
命令解释说明语法实例
hget获取hash的属性的值hget key fieldhget k1 name
hgetall获取所有的hash的属性和值hgetall keyhgetall k1
hmget批量获取hash的属性的值hmget key field [field ...]hmget k1 name age
hset设置hash的指定属性的值hset key field valuehset k1 name n1
hsetnx如果不存在,则设置hash的指定属性的值hsetnx key field valuehsetnx 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 keyhkeys k1
hvals获取key的所有属性的值hvals keyhvals k1
hstrlen获取指定key的指定属性的值的长度hstrlen key fieldhstrlen k1 name
hlen获取指定key的属性个数hlen keyhlen k1
hincrby指定key的指定属性值增加整数值hincrby key field incrementhincrby k1 age 5
hincrbyfloat指定key的指定属性值增加浮点值hincrbyfloat key field incrementhincrbyfloat k1 age 5.5
hexists判断是否存在某一个属性hexists key fieldhexists 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 keyscard k1
sdiff差集sdiff key [key ...]sdiff k1 k2
sdiffstore计算差集并将结果存储在另一个keysdiffstore destination key [key ...]sdiffstore result k1 k2
sinter交集sinter key [key ...]sinter k1 k2
sinterstore计算交集并将结果存储在另一个keysinterstore destination key [key ...]sinterstore result k1 k2
sismember判断是否存在值sismember key membersismember k1 v1
smembers获取set的所有值smember keysmember k1
smove移动set的指定值到另一个set中smove source destination membersmove 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 keyzcard k1
zcount计算value在min-max中的个数zcount key min maxzcount k1 1 10
zincrby指定值增加指定整数值zincrby key increment memberzincrby k1 10 v1
zinterstore交集并将结果存储到另一个zsetzinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM]zinterstore result k1 k2
zlexcount计算zset中score在min-max的值得个数zlexcount key min maxzlexcount 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获取指定元素的indexzrank key memberzrank k1 v1
zscan迭代zscan key cursor [MATCH pattern] [COUNT count]``
zscore获取指定值得scorezscore key memberzscore k1 v1
zunionstore计算并集并将结果存储到另一个zsetzunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM]zset result k1 k2
zrem删除一个或多个元素zrem key member [member ...]zrem k1 v1 v2 v3
应用场景
  • 微博热搜
  • 最新列表

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值