ClojureとRedis

人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術    データベース技術  デジタルトランスフォーメーション技術  Visualization & UX   ワークフロー&サービス.  プログラミング Clojure  データベース技術

前述の密結合する関数を疎結合にする手段として、Clojureの実現手段としてはSTM(software transaction Memory)を使う方法がある。たとえばatomを使うケースだと

(def my-atom (atom nil))
(defn my-func []
   (do (swap! my-atom assoc state-data)
       (function col)))

のように単純に関数の実行の間にmutableな変数を入れてやる方法や、core.asyncを使うケースだと

(def c (chan 1))
(take! c
     (fn [x]
        (println "Clojure Callback value " x)))
(put! c "hello world")

のような使い方ができる。ここでchanelとしてredisを用いるケースを紹介する。

Redis(REmote DIctionary Server)は、ネットワーク接続された永続化可能なインメモリデータベースで、連想配列、リスト、セットなどのデータ構造を扱える高速なkv-storeとなる。macで利用する場合は、home-brewを利用して「brew insatll redis」コマンドでインストールすることができる。

インストール後は「redis-server」コマンドで以下のように立ち上がる

7917:C 21 Mar 2021 06:17:55.399 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
7917:M 21 Mar 2021 06:17:55.400 * Increased maximum number of open files to 10032 (it was originally set to 256).
7917:M 21 Mar 2021 06:17:55.400 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 7917
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

7917:M 21 Mar 2021 06:17:55.402 # Server initialized
7917:M 21 Mar 2021 06:17:55.404 * Loading RDB produced by version 6.2.1
7917:M 21 Mar 2021 06:17:55.404 * RDB age 126144 seconds
7917:M 21 Mar 2021 06:17:55.404 * RDB memory usage when created 1.00 Mb
7917:M 21 Mar 2021 06:17:55.404 * DB loaded from disk: 0.002 seconds
7917:M 21 Mar 2021 06:17:55.404 * Ready to accept connections

ここでコマンドラインツールとしてredis-cliを用いると以下のようになる。

$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test "HELLO, World!!"
OK
127.0.0.1:6379> get test
"HELLO, World!!"

このRedisのClojureラッパーとしてCarmineがある。leiningenのdependenciesとしては

[com.taoensso/carmine 3.1.0]

を用いる。サンプルコードとしては以下のようなものがある。

(ns redis  
  (:require [taoensso.carmine :as car :refer (wcar)]))  

(def server1-conn {:pool {} :sepc {:host "127.0.0.1" :port 6379}})  
(defmacro wcar* [& body] `(car/wcar server1-conn ~@body))

(defn setter  
  [key value]  
  (wcar* (car/set key value)))  

(defn getter  
  [key]  
  (wcar* (car/get key)))  

(defn add-list
  [key value]
  (wcar* (car/lpush key value)))

(defn all-list
  [key]
  (wcar* (car/lrange key 0 -1)))

これを用いると、core.asyncのchanelと同様なものが容易に実装できる。またRedisのpub/sub機能を利用した分岐付きのpipeline処理も可能となる。次回はredisについてもう少し掘り下げる。

コメント

  1. […] 次回はこれらを使った実際のケースについていくつか述べてみたい。 […]

  2. […] ClojureとRedis […]

  3. […] ClojureとRedis kv storeの活用 […]

  4. […] ClojureとRedis ClojureでのRedisの活用 […]

  5. […] ClojureとRedis ClojureでのRedisの活用 […]

タイトルとURLをコピーしました