我正在开发一个 Spring-MVC 应用程序,我们使用 etherpad 作为文本编辑器。Etherpad 将其内容作为简单的键值对保存在数据库中。但对于这样一个简单的任务来说,性能太差了,而且 Etherpad 不执行任何 JOIN 或其他复杂的操作。出于这个原因,我们决定迁移到redis。Redis 正在工作,但我们的数据滞留在 postgresql 数据库中。我们如何将其移动到 Redis 第一个数据库。这是数据库的样子:
Redis 在本地工作于端口 6379。
所以我的项目有一个“朋友列表”,并且在 MySQL 数据库中我创建了一个表:
姓名A
姓名B
主键(名称A,名称B)
这将导致大量条目,但为了确保我的数据库标准化,我不确定还有什么方法可以实现这一点?
我的项目也使用Redis..我可以将它们存储在那里。
当一个人加入服务器时,我必须搜索所有条目,看看他们的名字是nameA还是nameB,然后将这两个名字放在一起作为好友,这也可能效率低下。
干杯。
我正在 Apache flink sql api 中构建管道。该管道执行简单的投影查询。但是,我需要在查询之前编写一次元组(确切地说是每个元组中的一些元素),在查询之后编写一次。事实证明,我用来写入 Redis 的代码严重降低了性能。即flink在很小的数据速率下做出反压。我的代码有什么问题以及如何改进。有什么建议请。
当我停止写入redis之前和之后,性能都非常好。这是我的管道代码:
public class QueryExample {
public static Long throughputCounterAfter=new Long("0");
public static void main(String[] args) {
int k_partitions = 10;
reamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.setParallelism(5 * 32);
Properties props = new Properties();
props.setProperty("zookeeper.connect", "zookeeper-node-01:2181");
props.setProperty("bootstrap.servers", "kafka-node-01:9092,kafka-node-02:9092,kafka-node-03:9092");
// not to be shared with another job consuming the same topic
props.setProperty("group.id", "flink-group");
props.setProperty("enable.auto.commit","false");
FlinkKafkaConsumer011<String> purchasesConsumer=new FlinkKafkaConsumer011<String>("purchases",
new SimpleStringSchema(),
props);
DataStream<String> purchasesStream = env
.addSource(purchasesConsumer)
.setParallelism(Math.min(5 * 32, k_partitions));
DataStream<Tuple4<Integer, Integer, Integer, Long>> purchaseWithTimestampsAndWatermarks …Run Code Online (Sandbox Code Playgroud) 所以我试图了解队列解决了哪些实际问题。通过阅读谷歌上的所有信息,我得到了高水平的信息。
因此,我正在研究 A 公司的架构,他们对于作业队列有不同的用例,例如
为什么要稍后处理呢?
这是我最好的猜测...
假设这是一个有效的用例,那么添加更多服务器来处理更多“事物”难道没有意义吗?是因为添加更多服务器比使用队列成本更高并且稍微牺牲响应时间吗?
根据我的用例示例,队列还能为它们解决哪些其他问题?
在 Docker 中运行 Redis
文件docker-compose.yml
version: "3.8"
services:
redis:
image: redis
volumes:
- ./data:/data
ports:
- 6379:6379
Run Code Online (Sandbox Code Playgroud)
docker pull redis
docker-compose up
docker-compose up -d
docker container ls
telnet localhost 6379
Run Code Online (Sandbox Code Playgroud)
如何连接到Redis服务器redis-cli?
我对Redis的困惑
如果我在我的服务器上安装 Redis,并且我的4 个不同客户端连接到同一台Redis 服务器,那么它们之间的数据将如何保持独立,以便一个客户端不会覆盖其他客户端已保存的键值对。
例如:-
client-1 设置名称=“adam”
client-2 设置名称=“henry”
因此,由于 Redis 服务器在这些客户端之间是通用的,客户端 1 设置的名称密钥将被客户端 2覆盖,因此当 客户端 1 执行 get name ==> henry 时(由于它已更新,这是错误的,他期望是亚当)
那么Redis是如何分离运行在同一台服务器上的多个用户实例的呢?它是否在内部创建单独的数据库或按用户存储还是什么?
我尝试在 Synfony5 应用程序中配置两个缓存池以使用特定命名空间并为项目设置默认到期日期。在尝试了无数次第无数次变化之后,我感觉我的配置正在循环。
到目前为止我的理解是: 在RedisAdapter 的 构造函数中,您可以设置命名空间和默认过期时间。在 createConnection 方法中,您可以设置 Redis 服务器的 url。
然而RedisAdapter的构造函数似乎已经需要一个redis客户端(= redis连接?)RedisAdapter:
/**
* @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface $redisClient The redis client
* @param string $namespace The default namespace
* @param int $defaultLifetime The default lifetime
*/
public function __construct($redisClient, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null)
{
$this->init($redisClient, $namespace, $defaultLifetime, $marshaller);
}
Run Code Online (Sandbox Code Playgroud)
如何将命名空间和 defaultLifetimes 注入 RedisAdapter?
到目前为止我尝试过的:cache.yaml:
framework:
cache:
pools:
cache.sap:
adapter: cache.adapter.redis
provider: app.service.puc_sap_redis_adapter
cache.pers:
adapter: cache.adapter.redis
provider: app.service.puc_pers_redis_adapter
Run Code Online (Sandbox Code Playgroud)
服务.yaml:
app.my_redis_adapter: …Run Code Online (Sandbox Code Playgroud) 当尝试使用 python Redis 包从缓存中读取时,它显示为已过期。这会在设置缓存后 5 秒内发生。不过,5 秒内的任何读取都有效。
但密钥设置为 180 秒或 3 分钟后过期。这有可能吗?此外,在第一次写入后,redis 密钥不会被写入/失效。
import redis
time_to_expire_s=180
client = redis.StrictRedis(host=self.host, port=self.port, password=self.password)
client.set(key, zlib.compress(value.encode('utf-8')), ex=time_to_expire_s)
Run Code Online (Sandbox Code Playgroud)
这是奇怪的行为吗?设置为更长的缓存,如 3600(1 小时)解决了我的问题,但想知道为什么 3 分钟的缓存会在 5 秒后过期......
谢谢
按照 url链接中的建议在本地运行 redis docker 映像, 从日志中可以看出该映像运行良好
docker pull redis
docker run --name some-redis -d redis
Run Code Online (Sandbox Code Playgroud)
然后docker启动。我可以看到如下日志
docker logs --follow some-redis
1:C 08 Jul 2021 07:17:51.243 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 08 Jul 2021 07:17:51.243 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 08 Jul 2021 07:17:51.243 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 08 Jul 2021 07:17:51.244 * monotonic clock: POSIX …Run Code Online (Sandbox Code Playgroud) redis ×10
java ×3
caching ×2
docker ×2
jedis ×2
amazon-sqs ×1
amazon-swf ×1
apache-flink ×1
backpressure ×1
flink-sql ×1
key ×1
migration ×1
mysql ×1
postgresql ×1
python ×1
rabbitmq ×1
redis-cli ×1
spring-boot ×1
sql ×1
symfony5 ×1