redis腳本
❶ 有誰可以提供一個檢測redis是否為master或者slave的檢測腳本
Redis的安裝目錄下有一個logs目錄,進入後打開redis.log,如果你是主備模式,裡面有類似Connection to MASTER xx:xx:xx:xx:6379的日誌信息,這個就是master地址,因為主備模式容易主備切換,你可以搜索關鍵字 "lost」,這個就代表哨兵檢測到主機down了,准備主備切換了。
❷ linux怎麼用腳本一次性啟動多個redis實例
需在同一台機器上啟動Redis的多個實例,將其當作不同的伺服器即可。單一的實例在某些時候可能是不夠用的,所以如果想使用多個CPU,這就需要開始思 考早期的一些數據段。這里需要注意的是,使用Redis Pipelining在Linux系統上運行,每秒可以提供5.
❸ 什麼腳本可以關閉redis
stop.sh腳本
#!/bin/sh
PID=`ps-ef|grep"redis-server"|grep-vgrep|awk'{print$2}'`;
if[!-z"$PID"];then
kill-9"$PID"
echo"[INFO]Killisdown."
else
echo"[WARN]redis-serverisnotstart."
fi
echo"[INFO]stop.shisdown."
❹ java調用redis腳本執行結果。本地執行結果為正確,伺服器執行結果為錯誤。有可能嗎為什麼
lua腳本么?確實有這種情況,這時候你這樣:
將腳本需要的參數都先寫死到腳本里,不使用外部傳參
直接將腳本拿到伺服器使用redis客戶端執行 ./redis-cli --eval 腳本
這樣如果有錯可以直接在這進行查找,java端不好排錯
❺ 如何使用SHELL編寫redis的啟動腳本
#!/bin/bash
#
# Init file for redis
# From: JC
# Email:[email protected]
# chkconfig: - 80 12
# description: redis daemon
#
# processname: redis
# config: /opt/redis-2.6.4/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
BIN="/opt/redis/bin"
CONFIG="/opt/redis-2.6.4/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
if [ -e $PIDFILE ];then
echo "$desc already running...."
exit 1
fi
echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG &
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
[root@dg-web opt]# /etc/init.d/redis status
redis-server (pid 26147) is running...
[root@dg-web opt]# netstat -lntp|grep redis-server
URL:http://www.bianceng.cn/database/MySQL/201410/46081.htm
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 26147/redis-server
[root@dg-web opt]# /etc/init.d/redis stop
Stop Redis Server: [ OK ]
[root@dg-web opt]# /etc/init.d/redis status
redis-server is stopped
[root@dg-web opt]# netstat -lntp|grep redis-server
❻ redis有腳本語言嗎
有,lua腳本語言
Redis腳本
使用腳本的好處:
減少網路開銷。可以將多個請求通過腳本的形式一次發送,減少網路時延
原子操作。redis會將整個腳本作為一個整體執行,中間不會被其他命令插入。因此在編寫腳本的過程中無需擔心會出現競態條件,無需使用事務。
復用。客戶端發送的腳步會永久存在redis中,這樣,其他客戶端可以復用這一腳本而不需要使用代碼完成相同的邏輯。
--eval,告訴redis-cli讀取並運行後面的lua腳本
path/to/redis.lua,是lua腳本的位置
KEYS[1] KEYS[2],是要操作的鍵,可以指定多個,在lua腳本中通過KEYS[1], KEYS[2]獲取
ARGV[1] ARGV[2],參數,在lua腳本中通過ARGV[1], ARGV[2]獲取。
- redis.call('set', 'foo', 'bar')local value=redis.call('get', 'foo') --value的值為bar
EVAL "lua-script" [key ...] [arg ...]
通過key和arg這兩類參數向腳本傳遞數據,它們的值在腳本中分別使用KEYS和ARGV兩個表類型的全局變數訪問。
注意: EVAL命令依據參數key-number來將其後面的所有參數分別存入腳本中KEYS和ARGV兩個table類型的全局變數。當腳本不需要任何參數時,也不能省略這個參數(設為0)
redis>EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar
OK
redis>GET foo"bar"EVALSHA命令
在腳本比較長的情況下,如果每次調用腳本都需要將整個腳本傳給Redis會佔用較多的帶寬。為了解決這個問題,Redis提供了EVALSHA命令,允許開發者通過腳本內容的SHA1摘要來執行腳本,該命令的用法和EVAL一樣,只不過是將腳本內容替換成腳本內容的SHA1摘要。
Redis在執行EVAL命令時會計算腳本的SHA1摘要並記錄在腳本緩存中,執行EVALSHA命令時Redis會根據提供的摘要從腳本緩存中查找對應的腳本內容,如果找到了則執行腳本,否則會返回錯誤:"NOSCRIPT No matching script. Please use EVAL."
在程序中使用EVALSHA命令的一般流程如下。
雖然這一流程略顯麻煩,但值得慶幸的是很多編程語言的Redis客戶端都會代替開發者完成這一流程。執行EVAL命令時,先嘗試執行EVALSHA命令,如果失敗了才會執行EVAL命令。
先計算腳本的SHA1摘要,並使用EVALSHA命令執行腳本。
獲得返回值,如果返回「NOSCRIPT」錯誤則使用EVAL命令重新執行腳本。
SCRIPTLOAD "lua-script"
將腳本加入緩存,但不執行. 返回:腳本的SHA1摘要
SCRIPT EXISTS lua-script-sha1
判斷腳本是否已被緩存
SCRIPT FLUSH
清空腳本緩存 redis將腳本的SHA1摘要加入到腳本緩存後會永久保留,不會刪除,但可以手動使用SCRIPT FLUSH命令情況腳本緩存。
SCRIPT KILL
強制終止當前腳本的執行。 但是,如果當前執行的腳步對redis的數據進行了寫操作,則SCRIPT KILL命令不會終止腳本的運行,以防止腳本只執行了一部分。腳本中的所有命令,要麼都執行,要麼都不執行。
調用Lua腳本的語法:
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...
注意:
KEYS和ARGV中間的 ',' 兩邊的空格,不能省略。
redis支持大部分Lua標准庫
庫名
說明
Base 提供一些基礎函數
String 提供用於字元串操作的函數
Table 提供用於表操作的函數
Math 提供數學計算函數
Debug 提供用於調試的函數
在腳本中調用redis命令
在腳本中可以使用redis.call函數調用Redis命令
redis.call函數的返回值就是Redis命令的執行結果
Redis命令的返回值有5種類型,redis.call函數會將這5種類型的回復轉換成對應的Lua的數據類型,具體的對應規則如下(空結果比較特殊,其對應Lua的false)
redis返回值類型和Lua數據類型轉換規則
redis返回值類型
Lua數據類型
整數回復 數字類型
字元串回復 字元串類型
多行字元串回復 table類型(數組形式)
狀態回復 table類型(只有一個ok欄位存儲狀態信息)
錯誤回復 table類型(只有一個err欄位存儲錯誤信息)
redis還提供了redis.pcall函數,功能與redis.call相同,唯一的區別是當命令執行出錯時,redis.pcall會記錄錯誤並繼續執行,而redis.call會直接返回錯誤,不會繼續執行。
在腳本中可以使用return語句將值返回給客戶端,如果沒有執行return語句則默認返回nil
Lua數據類型和redis返回值類型轉換規則
Lua數據類型
redis返回值類型
數字類型 整數回復(Lua的數字類型會被自動轉換成整數)
字元串類型 字元串回復
table類型(數組形式) 多行字元串回復
table類型(只有一個ok欄位存儲狀態信息) 狀態回復
table類型(只有一個err欄位存儲錯誤信息) 錯誤回復
腳本相關命令
Redis的腳本執行是原子的,即腳本執行期間Redis不會執行其他命令。所有的命令都必須等待腳本執行完成後才能執行。為了防止某個腳本執行時間過長導致Redis無法提供服務(比如陷入死循環),Redis提供了lua-time-limit參數限制腳本的最長運行時間,默認為5秒鍾。當腳本運行時間超過這一限制後,Redis將開始接受其他命令但不會執行(以確保腳本的原子性,因為此時腳本並沒有被終止),而是會返回「BUSY」錯誤
❼ 為什麼在 Redis 實現 Lua 腳本事務
數據完整性
從很多方面來看,Redis 很像當初採用 InnoDB 前的 MySQL。而 Redis 採用了一種很合理的方式來保證數據完整性(復制,AOF 等),並且從 Redis2.6 開始引入的 Lua 腳本在功能與易用性方面為 Redis 的成長提供了很大助力。
相對來說,Lua 腳本與其他資料庫中的存儲過程很相似,但腳本的執行有些許不同。在本文中最重要的一點就是一旦將腳本寫入資料庫,它會一直執行直到以下任一種情況出現:
1. 完成所有工作,所有寫操作處理完成後腳本會自動退出。
2. 腳本運行時出錯並中途退出,所有以前執行的寫操作都已發生,但不會再有其他寫操作。
3. Redis 通過 SHUTDOWN NOSAVE 關閉時(不保存)。
4. 你附加了調試器來「使」腳本完成 #1 與 #2 (或其他手段來保證不會丟失數據)。
對於使用資料庫開發軟體的人,我想你也認同只有情景 #1 是最理想的。情景 #2,#3,#4 都會導致數據異常(#2 與
#4)和/或數據丟失(#3 和 #4)。如果你很重視數據,你應該盡可能地阻止數據異常與丟失。這不是哲學,而是工作(This is not
philosophy, this is doing your job)。但很遺憾目前的 Redis 也幫不了你多少。所以我決定改變這種情況。
❽ 怎樣設計python腳本實現redis的set命令
#!/usr/bin/python
#coding=utf-8
import redis
class CRedis:
def __init__(self):
self.host = 'localhost'
self.port = 6379
self.db = 0
self.r = redis.Redis(host = self.host, port = self.port, db = self.db)
#1. strings 類型及操作
#設置 key 對應的值為 string 類型的 value
def set(self, key, value):
return self.r.set(key, value)
#設置 key 對應的值為 string 類型的 value。如果 key 已經存在,返回 0,nx 是 not exist 的意思
def setnx(self, key, value):
return self.r.setnx(key, value)
#設置 key 對應的值為 string 類型的 value,並指定此鍵值對應的有效期
def setex(self, key, time, value):
return self.r.setex(key, time, value)
#設置指定 key 的 value 值的子字元串
#setrange name 8 gmail.com
#其中的 8 是指從下標為 8(包含 8)的字元開始替換
def setrange(self, key, num, value):
return self.r.setrange(key, num, value)
#獲取指定 key 的 value 值的子字元串
def getrange(self, key, start ,end):
return self.r.getrange(key, start, end)
#mget(list)
def get(self, key):
if isinstance(key, list):
return self.r.mget(key)
else:
return self.r.get(key)
#刪除
def remove(self, key):
return self.r.delete(key)
#自增
def incr(self, key, default = 1):
if (1 == default):
return self.r.incr(key)
else:
return self.r.incr(key, default)
#自減
def decr(self, key, default = 1):
if (1 == default):
return self.r.decr(key)
else:
return self.r.decr(key, default)
#2. hashes 類型及操作
#根據email獲取session信息
def hget(self, email):
return self.r.hget('session', email)
#以email作為唯一標識,增加用戶session
def hset(self, email, content):
return self.r.hset('session', email, content)
#獲取session哈希表中的所有數據
def hgetall(self):
return self.r.hgetall('session')
#刪除hashes
def hdel(self, name, key = None):
if(key):
return self.r.hdel(name, key)
return self.r.hdel(name)
#清空當前db
def clear(self):
return self.r.flushdb()
#3、lists 類型及操作
#適合做郵件隊列
#在 key 對應 list 的頭部添加字元串元素
def lpush(self, key ,value):
return self.r.lpush(key, value)
#從 list 的尾部刪除元素,並返回刪除元素
def lpop(self, key):
return self.r.plush(key)
if __name__ == '__main__':
r = CRedis()
❾ redis lua腳本有什麼用
主要用途是: (1)描述界面:WOW和劍網三的界面都是用LUA寫的; (2)溝通引擎:游戲圖形引擎提供了一些介面庫,可以在LUA中調用; (3)伺服器端:有些游戲,例如劍網三,在伺服器端也會大量使用LUA。