人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術 データベース技術 デジタルトランスフォーメーション技術 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についてもう少し掘り下げる。
コメント
[…] 次回はこれらを使った実際のケースについていくつか述べてみたい。 […]
[…] ClojureとRedis […]
[…] ClojureとRedis kv storeの活用 […]
[…] ClojureとRedis ClojureでのRedisの活用 […]
[…] ClojureとRedis ClojureでのRedisの活用 […]