㈠ 用python查詢redis數據,結果中前面為什麼總是有字母b
使用Redis的腳本功能實現Redis中數據簡單查詢,有需要的朋友可以參考下。 在Redis的設計中,key是一切,對於Redis是可見的,而value對於Redis來說就是一個位元組數組,Redis並不知道你的value中存儲的是什麼,所以要想實現比如 『select * from use...
㈡ python 用redis做什麼功能
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,
並使用官方的語法和命令,Redis是StrictRedis的子類,用於向後兼容舊版本的redis-py。
import redis 導入redis模塊,通過python操作redis 也可以直接在redis主機的服務端操作緩存資料庫
r = redis.Redis(host='192.168.19.130', port=6379) host是redis主機,需要redis服務端和客戶端都起著 redis默認埠是6379
r.set('foo', 'Bar') key是"foo" value是"bar" 將鍵值對存入redis緩存
print r.get('foo') Bar 取出鍵foo對應的值!
㈢ 使用python同步mysql到redis由於數據較多,一條一條讀出來寫到redis太慢,有沒有可以批量操作的。
MYSQL快速同步數據到Redis
舉例場景:存儲游戲玩家的任務數據,游戲伺服器啟動時將mysql中玩家的數據同步到redis中。
從MySQL中將數據導入到Redis的Hash結構中。當然,最直接的做法就是遍歷MySQL數據,一條一條寫入到Redis中。這樣沒什麼錯,但是速度會非常慢。如果能夠想法使得MySQL的查詢輸出數據直接能夠與Redis命令行的輸入數據協議相吻合,可以節省很多消耗和縮短時間。
Mysql資料庫名稱為:GAME_DB, 表結構舉例:
CREATE TABLE TABLE_MISSION (
playerId int(11) unsigned NOT NULL,
missionList varchar(255) NOT NULL,
PRIMARY KEY (playerId)
);
Redis中的數據結構使用哈希表:
鍵KEY為mission, 哈希域為mysql中對應的playerId, 哈希值為mysql中對應的missionList。 數據如下:
[root@iZ23zcsdouzZ ~]# redis-cli
127.0.0.1:6379> hget missions 36598
"{\"10001\":{\"status\":1,\"progress\":0},\"10002\":{\"status\":1,\"progress\":0},\"10003\":{\"status\":1,\"progress\":0},\"10004\":{\"status\":1,\"progress\":0}}"
快速同步方法:
新建一個後綴.sql文件:mysql2redis_mission.sql
內容如下:
SELECT CONCAT(
"*4\r\n",
'$', LENGTH(redis_cmd), '\r\n',
redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'$', LENGTH(hkey), '\r\n',
hkey, '\r\n',
'$', LENGTH(hval), '\r\n',
hval, '\r'
)
FROM (
SELECT
'HSET' as redis_cmd,
'missions' AS redis_key,
playerId AS hkey,
missionList AS hval
FROM TABLE_MISSION
) AS t
創建shell腳本mysql2redis_mission.sh
內容:
mysql GAME_DB --skip-column-names --raw < mission.sql | redis-cli --pipe
Linux系統終端執行該shell腳本或者直接運行該系統命令,即可將mysql資料庫GAME_DB的表TABLE_MISSION數據同步到redis中鍵missions中去。mysql2redis_mission.sql文件就是將mysql數據的輸出數據格式和redis的輸入數據格式協議相匹配,從而大大縮短了同步時間。
經過測試,同樣一份數據通過單條取出修改數據格式同步寫入到redis消耗的時間為5min, 使用上面的sql文件和shell命令,同步完數據僅耗時3s左右。
㈣ python 中對redis 操作採用裝飾器進行處理,怎麼做
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類,用於向後兼容舊版本的redis-py。importredis導入redis模塊,通過python操作redis也
㈤ python redis setex可以設value為list或者其他數據結構嗎
redis setex 命令存放php數組將返回Array, 如果場景確定適合用,就存放前序列化,取時再反序列化,如果是二維數組,建議用Hash數據
redis 數據結構多樣化,根據不同的業務場景滿足各種不同的需求
Hash 對應的場景(常用,歡迎大家補充討論)
產品各參數信息
用戶信息等
使用過活動專題上的點贊場景等
Hash 常見的命令
hgetall - 以列表形式返回哈希表的域和域的值,若key不存在,返回空列表
hget - hget key field 返回哈希表key中給定域field 的值
hmset - hmset key field value [field value ...] 同時設置多個值,成功返回ok
hsetnx - hsetnx key field value 如果域field 已經存在,該操作無效,返回0,成功返回1
hset - hset key field value 一個新的哈希表被創建並進行設置值,如果域field已經存在於哈希表中,舊值被覆蓋
hgetall 取得全部屬性 但是如果內部Map的成員很多,那麼涉及到遍歷整個內部Map的操作,由於Redis單線程模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意。
hlen - 返回哈希表key中域的數量
hvals - 返回哈希表key中的所有值
hdel - 刪除一個或多個的域,例: hdel key field0 field1 返回成功刪除的數量,成功刪除2個即返回2
# 其它看官網文檔
可以仔細了解redis 各數據結構(重要),具體根據自己的業務場景使用
㈥ python怎麼使用redis
(1)使用 # easy_install redis
(2)直接編譯安裝
#wget https://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz
#tar xvzf redis-2.9.1.tar.gz
#cd redis-2.9.1
#python setup.py install
㈦ 編寫一個python程序實現redis集群的訪問
用python-2.7.3\python是對的,但是你的hello.py放在那裡?你需要先用「cd 目錄名」轉換當前目錄到存放hello.py的地方,然後執行python-2.7.3\python hello.py。
㈧ python 獲取的redis里的數據怎麼處理
一、獲取所有Key
[python]view plain
#-*-encoding:UTF-8-*-
__author__="Sky"
importredis
pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
r=redis.StrictRedis(connection_pool=pool)
keys=r.keys()
printtype(keys)
printkeys
運行結果:
<type 'list'>
['fad', '1', '2']
二、獲取所有內容
[python]view plain
importredis
pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
r=redis.Redis(connection_pool=pool)
pipe=r.pipeline()
pipe_size=100000
len=0
key_list=[]
printr.pipeline()
keys=r.keys()
forkeyinkeys:
key_list.append(key)
pipe.get(key)
iflen<pipe_size:
len+=1
else:
for(k,v)inzip(key_list,pipe.execute()):
printk,v
len=0
key_list=[]
for(k,v)inzip(key_list,pipe.execute()):
printk,v
運行結果:
fad fda
1 e
㈨ python 的 redis 庫,連接池怎麼用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import redis
host = r'localhost'
port = 6379
POOL = redis.ConnectionPool(host=host, port=port, db=0)
my_server = redis.Redis(connection_pool=POOL)
def read_in_data(file_name):
data = []
with open(file_name, 'r') as f:
for line in f:
line = line.strip()
data.append(line.split(','))
return data
def write_data_to_redis(data):
my_server.set('counter', 0)
for items in data:
my_server.incr('counter')
for item in items:
my_server.rpush(items[0], item)
def get_data_from_redis():
keys = my_server.keys()
for key in keys:
data_type = my_server.type(key)
if data_type == 'list':
val = my_server.lrange(key, 0, -1)
elif data_type == 'string':
val = my_server.get(key)
print "%s:%s" % (key, val)
if __name__ == '__main__':
fileName = r'/Users/qinchuanqing/Code/workspace/IMP/installation/storage/NeSchele.txt'
data = read_in_data(fileName)
write_data_to_redis(data)
print 'all data items number is %s' % my_server.get('counter')
print my_server.keys()
print get_data_from_redis()
㈩ python中的redis有多少個資料庫
跟Python沒有關系,是redis的問題
1、redis 中的每一個資料庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 資料庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。
2、當redis 伺服器初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件配置),所有資料庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇資料庫 select number 時,程序直接通過 redisServer.db[number] 來切換資料庫。有時候當程序需要知道自己是在哪個資料庫時,直接讀取 redisDb.id 即可。
3、既然我們知道一個資料庫的所有鍵值都存儲在redisDb.dict中,那麼我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:
typedef struct dict {
// 特定於類型的處理函數
dictType *type;
// 類型處理函數的私有數據
void *privdata;
// 哈希表(2個)
dictht ht[2];
// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;
// 當前正在運作的安全迭代器數量
int iterators;
} dict;
由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用於存儲資料庫的所有鍵值,而1號哈希表主要用於程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。
4、既然是哈希,那麼我們知道就會有哈希碰撞,那麼當多個鍵哈希之後為同一個值怎麼辦呢?redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。
二、當redis 拿到一個key 時,如果找到該key的位置。
了解了上述知識之後,我們就可以來分析redis如果在內存找到一個key了。
1、當拿到一個key後, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。
2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麼兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用於對資料庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。
3、計算哈希表,根據當前字典與key進行哈希值的計算。
4、根據哈希值與當前字典計算哈希表的索引值。
5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。
6、當 ht[0] 查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。
到此我們就找到了key在內存中的位置了。