redis 应用实践
redis 简介 redis 是一个很火的开源键值内存数据库。官方网站是 http://redis.io/。 redis的应用很广泛,就我的感觉来说,web app用的比较多。 项目中的经验 我在项目中用到了redis来作为缓存和pubsub功能,体会到了它的一些强大,这里做一下总结。 刚接触re
redis 简介
redis 是一个很火的开源键值内存数据库。官方网站是 http://redis.io/。
redis的应用很广泛,就我的感觉来说,web app用的比较多。
项目中的经验
我在项目中用到了redis来作为缓存和pubsub功能,体会到了它的一些强大,这里做一下总结。
刚接触redis时的两个命令是 get/set,很简单,set key val,就在redis的某个编号的数据库中存放了一个键值对,通过get key 可以获取这个键对应的值。和平时使用的mysql等关系型数据库有很大的区别,设置值,读取值太简洁了,这也是内存数据库的一个特点,要能够快速,简洁的添加、读取、删除值。
在我的项目中,把redis当做了一个pubsub工具来用,同时也用作了写文件的缓存。下面将分别描述一下如何使用的。
redis作为写文件的缓存
我有大概四千个文件需要被写入,源数据都是一条数据只有58字节,一秒钟大概有1000条这样的数据产生,也就是说,一秒钟要打开关闭1000个文件并写入数据,对系统和磁盘来说,都是个压力,并且这样的解决方法很有问题,很自然的就想到了用缓存。缓存了一定量的数据后,再写入文件中,减少磁盘操作,同时也提高了写入效率。
如何做缓存,如果自己来维护,就要维护4000份不同文件的缓存,用程序来维护4000份缓存,并且根据不同的缓存大小触发写文件的操作,想想都觉得困难有点大。这个时候自然地就想到了redis这个内存数据库。
redis有一个操作室 append,它向一个key追加内容,如果key不存在就创建一个,同时返回变更后的字符串长度,这个命令实在是太好用了,一下子就解决了我的问题。
通过在redis中维护4000个key,根据接收到的不同的数据,追加到不同的key上,根据返回的数据长度,当达到预期的长度后,就取出来并清空原来的值,把取出来的值写入文件中,整个过程,逻辑清晰明白。
在实际编写程序的过程中,还有一些细节需要处理,比如说,对于每一个append操作,客户端都要和redis服务器进行交互,获取提交结果,那么有无办法减少这个操作,改为批量提交呢?有的。redis有个pipeline命令,就是干这个活的,客户端通过pipeline向服务器提交数据,redis服务器不立即返回结果,而是放在一个队列中,当客户端执行了execute操作后,一次性按照提交的顺序返回执行的结果。然后再对返回的结果进行对比,寻找符合长度的数据。这样的操作,可以大幅度降低耗时,提高程序运行速度和性能。
当寻找到了符合预定长度的数据时,就使用redis的 getset(key, "") 命令,这个命令取出来key中的值,同时给key赋一个新值,这就满足了原子操作性,不会出现当一个进程对这个key取数据后,赋值新数据前,另外一个进程往这个key中写数据而导致数据的丢失的问题。找到了需要写入文件的数据后,如何通知程序写入文件呢?有同步和异步两种方法,同步就是在同一个进程/线程中继续写文件,等文件写完毕后,再做其他操作,这样的好处也许是程序实现相对简单,但是在高性能环境下,却不一定是可以接受的方法,耗时!异步呢?实现异步的方式有很多,一种是启一个新的线程去做这个时,另外一种就是用消息队列。在这个场景中,起一个新的线程去做这个事不讨好,并且也不够稳定。有一个celery的消息队列,网站自身的介绍是近乎实时的分布式消息队列。
正好,把celery拿过来用,当程序检测到符合长度后,取出来数据,通过publish的方式,通知一个sub client,subclient 接收到这个消息后,就调用celery 的task 去执行写的操作,如此,整个业务逻辑流程就串了起来,见下图的描述。
redis使用感受
redis使用起来非常的方便,同时也容易造成滥用。任何工具都有它的适用场景,有很多人拿到一个好用的工具,干什么都要用上来。我以前也犯过类似的错误,觉得c语言就是好,写一个下载网页的程序都要用c来写,结果换用python 就是几句话的事,人生苦短,不要和自己过不去,用合适的工具,完成合适的事情。
原文地址:redis 应用实践, 感谢原作者分享。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redis-Serverが見つからない問題を解決するための手順:インストールを確認して、Redisが正しくインストールされていることを確認します。環境変数Redis_hostとredis_portを設定します。 Redis Server Redis-Serverを起動します。サーバーがRedis-Cli pingを実行しているかどうかを確認します。

Redis Clusterは、Redisインスタンスの水平拡張を可能にする分散展開モデルであり、ノード間通信、ハッシュスロット部門キースペース、ノード選挙、マスター奴隷レプリケーション、コマンドリダイレクトを通じて実装されます。ハッシュスロット:キースペースをハッシュスロットに分割して、キーの責任ノードを決定します。ノード選挙:少なくとも3つのマスターノードが必要であり、選挙メカニズムを通じて1つのアクティブマスターノードのみが保証されます。マスタースレーブレプリケーション:マスターノードはリクエストの書き込みを担当し、スレーブノードはリクエストとデータレプリケーションを読む責任があります。コマンドリダイレクト:クライアントはキーを担当するノードに接続し、ノードは誤ったリクエストをリダイレクトします。トラブルシューティング:障害検出、オフラインのマーク、および再

Redisバージョン番号を表示するには、次の3つの方法を使用できます。(1)情報コマンドを入力し、(2) - versionオプションでサーバーを起動し、(3)構成ファイルを表示します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redis Orderedセット(ZSET)は、並べ替えられた要素を保存し、関連するスコアでソートするために使用されます。 zsetを使用する手順には次のものがあります。1。zsetを作成します。 2。メンバーを追加します。 3.メンバースコアを取得します。 4。ランキングを取得します。 5.ランキング範囲のメンバーを取得します。 6.メンバーを削除します。 7.要素の数を取得します。 8。スコア範囲のメンバーの数を取得します。

Redisは、キーの一意性を確保するために5つの戦略を使用します。1。名前空間分離。 2。ハッシュデータ構造。 3.データ構造を設定します。 4。文字列キーの特殊文字。 5。LUAスクリプト検証。特定の戦略の選択は、データ組織、パフォーマンス、およびスケーラビリティ要件に依存します。
