Redis *** 作字符串、List、Map、Set的简单使用

Redis *** 作字符串、List、Map、Set的简单使用,第1张

package comnoonhopecontrollerappsystem;

import orgjunitBefore;

import orgjunitTest;

import redisclientsjedisJedis;

import redisclientsjedisJedisPool;

import redisclientsjedisJedisPoolConfig;

import javautilHashMap;

import javautilIterator;

import javautilList;

import javautilMap;

public class TestRedis {

}

举例来说,每次当某个事件发生时,进程可能对一个名为 key调用 [ INCR ] *** 作,通常我们还要在一个原子时间内同时完成获得计数器的值和将计数器值复位为 0 两个 *** 作。

可以用命令 GETSET mycounter 0 来实现这一目标。

首先,分布式锁和我们平常讲到的锁原理基本一样,目的就是确保在多个线程并发时,只有一个线程在同一刻 *** 作这个业务或者说方法、变量。

在一个进程中,也就是一个jvm或者说应用中,我们很容易去处理控制,在 javautil 并发包中已经为我们提供了这些方法去加锁,比如 synchronized 关键字或者 Lock 锁,都可以处理。

但是如果在分布式环境下,要保证多个线程同时只有1个能访问某个资源,就需要用到分布式锁。这里我们将介绍用Redis的 setnx 命令来实现分布式锁。

其实目前通常所说的 setnx 命令,并非单指redis的 setnx key value 这条命令,这条命令可能会在后期redis版本中删除。

一般代指redis中对 set 命令加上 nx 参数进行使用, set 这个命令,目前已经支持这么多参数可选:

从 Redis 2612 版本开始, SET 命令的行为可以通过一系列参数来修改:

注入bean

这里同时启动5个线程并发往redis中存储 lock 这个key(key可以自定义,但需要一致),同时设置10秒的过期时间。

setIfAbsent 这个函数实现的功能与 setnx 命令一样,代表如果没有这个key则set成功获取到锁,否则set失败没有获取到锁。

获得锁后进行资源的 *** 作,最后释放锁。

执行效果

可以看到同时只有1个线程能够获取到锁。

使用 setnx 命令方式虽然 *** 作比较简单方便,但是会有如下问题:

可以在再次获取锁时,如果锁被占用就get值,判断值是否是当前线程存的随机值,如果是则再次执行 set 命令重新上锁;当然为了保证原子性这些 *** 作都要用 lua 脚本来执行。

可以使用 while 循环重复执行 setnx 命令,并设置一个超时时间退出循环。

可以尽量把锁自动过期的时间设的冗余一些。但也不能彻底解决。

可以在删除锁的时候先get值,判断值是否是当前线程存的随机值,只有相同才执行删锁的 *** 作;当然也要使用 lua 脚本执行来保证原子性。

分布式锁需要满足的特性

综上:使用 setnx 命令来实现分布式锁并不是一个很严谨的方案,如果是Java技术栈,我们可以使用 Redisson 库来解决以上问题,接下来的文章会介绍如何使用。

Redisson实现分布式锁

Redlock实现分布式锁

自定义pojo 实现Serializable 接口:

package cnmingyuanredis;

import javaioSerializable;

/

测试用pojo,实现了Serializable,以便进行系列化 *** 作

@author mingyuan

/

题主是否想询问“redis的set方法耗时高的原因是什么”原因有数据库负载过高、网络延迟、Redis内存使用过多、 *** 作数据过大。

1、数据库负载过高:如果Redis实例的负载较高,就会导致set *** 作的响应时间变慢。可以通过查看Redis的监控信息,确定是否存在负载过高的情况。

2、网络延迟:如果Redis服务器和客户端之间的网络延迟较大,会导致set *** 作的耗时增加。可以尝试优化网络设置,如调整TCP参数、更换网络硬件等。

3、Redis内存使用过多:如果Redis已经占用了大部分可用内存,会导致set *** 作变慢或失败。可以尝试优化Redis的内存配置,如使用更高效的数据结构、通过分片方式扩容等。

4、 *** 作数据过大:如果set *** 作要处理的数据量过大,会导致 *** 作耗时增加。可以尝试减小set *** 作要处理的数据量,如拆分为多个 *** 作、使用批量 *** 作等。

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

KEYS 匹配数据库中所有 key 。

KEYS hllo 匹配 hello , hallo 和 hxllo 等。

KEYS hllo 匹配 hllo 和 heeeeello 等。

KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。

特殊符号用 \ 隔开

KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。

ava *** 作redis的jedis的范围查询是怎么写的? 我要从一个范围到另一个范围的区间

我试过了,

List userList = jedislrange("userList", 0, -1);

Set user = jediszrange("user", 0, -1);

这两个范围查询的得到结果,为何都是 0

但是我用 Set str =jediskeys("tes2:");

发现是用完整的数据的,我一次性读取这么多数据,redis直接socket失败了

它是专为 NET 平台设计的一种静态类型编程语言。 Nemerle 中的程序会被编译成中间语言字节码。它支持函数式,命令式以及面向对象编程。

以上就是关于Redis *** 作字符串、List、Map、Set的简单使用全部的内容,包括:Redis *** 作字符串、List、Map、Set的简单使用、Redis通过getset和incr实现复位 *** 作计数器、Redis的Setnx命令实现分布式锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9523458.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存