數據類型:Hash散列數據類型


Hash散列數據類型

一定義

1、由field和關聯的value組成的鍵值對
2、field和value是字符串類型
3、一個hash中最多包含2^32-1個鍵值對

二優點

1、節約內存空間
2、每創建一個鍵,它都會為這個鍵儲存一些附加的管理信息(比如這個鍵的類型,這個鍵最后一次被訪問的時間等)
3、鍵越多,redis數據庫在儲存附件管理信息方面耗費內存越多,花在管理數據庫鍵上的CPU也會越多

三缺點(不適合hash情況)

1、使用二進制位操作命令:SETBIT、GETBIT、BITCOUNT等,如果想使用這些操作,只能用字符串鍵
2、使用過期鍵功能:鍵過期功能只能對鍵進行過期操作,而不能對散列的字段進行過期操作

四基本命令操作

# 1、設置單個字段
  HSET key field value
  HSETNX key field value
# 2、設置多個字段
  HMSET key field value field value
# 3、返回字段個數
  HLEN key
# 4、判斷字段是否存在(不存在返回0)
  HEXISTS key field
# 5、返回字段值
  HGET key field
# 6、返回多個字段值
  HMGET key field filed
# 7、返回所有的鍵值對
  HGETALL key
# 8、返回所有字段名
  HKEYS key
# 9、返回所有值
  HVALS key
# 10、刪除指定字段
  HDEL key field 
# 11、在字段對應值上進行整數增量運算
  HINCRBY key filed increment
# 12、在字段對應值上進行浮點數增量運算
  HINCRBYFLOAT key field increment

五python基本方法

# 1、更新一條數據的屬性,沒有則新建
    hset(name, key, value) 
# 2、讀取這條數據的指定屬性, 返回字符串類型
    hget(name, key)
# 3、批量更新數據(沒有則新建)屬性,參數為字典
    hmset(name, mapping)
# 4、批量讀取數據(沒有則新建)屬性
    hmget(name, keys)
# 5、獲取這條數據的所有屬性和對應的值,返回字典類型
    hgetall(name)
# 6、獲取這條數據的所有屬性名,返回列表類型
    hkeys(name)
# 7、刪除這條數據的指定屬性
    hdel(name, *keys)

python代碼hash散列

import redis

r = redis.Redis(host="192.168.153.136", port=6379, db=0)
# 新建一條鍵名為"user1"的數據, 包含屬性name
r.hset("user1", "name", 'zhanshen001')
# 更改鍵名為"user1"的數據, 更改屬性username的值
r.hset("user1", "name", 'zhanshen002')

# 取出屬性username的值
username = r.hget("user1", "name")

# 輸出看一下
print('name',username)

# 屬性集合
user_dict = {
    "password": "123456",
    "name": "Wang Success",
    "sex": "male",
    "height": '178',
    "Tel": '13838383888',
}
# 批量添加屬性
r.hmset("user1", user_dict)
# 取出所有數據(返回值為字典)
all_data = r.hgetall("user1")
print('all_data:', all_data)
# 刪除屬性(可以批量刪除)
r.hdel("user1", "Tel")
# 取出所有屬性名 : 列表
h_keys = r.hkeys("user1")
print('all_key_name:',h_keys)
# 取出所有屬性值 : 列表
h_values = r.hvals('user1')
print('all_values:',h_values)

應用場景: redis+mysql+hash組合使用

原理:

  用戶想要查詢個人信息
  1、到redis緩存中查詢個人信息
  2、redis中查詢不到,到mysql查詢,並緩存到redis
  3、再次查詢個人信息

import redis
import pymysql

# 1.先到redis中查詢
# 2.redis中沒有,到mysql查詢,緩存到redis(設置過期時間)
# 3.在查詢redis
r = redis.Redis(host="127.0.0.1", port=6379, db=0)
"""
key:user
filed:username
filed:password
filed:gender
filed:age
"""
res = r.hgetall("user")

if res:
  print(res)
else:
  # redis沒有緩存
  db = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='userdb',
    charset='utf8'
  )
  username = input('請輸入用戶名')
  cursor = db.cursor()
  sele = 'select username,age,gender from user where username=%s'
  cursor.execute(sele,[username])
  userinfo = cursor.fetchall()
  if not userinfo:
    print('用戶不存在')
  else:
    #打印輸出
    #(('haha', 36, 'M'),)
    print('mysql',userinfo)
    #緩存到redis
    user_dict = {
      'username':userinfo[0][0],
      'age':userinfo[0][1],
      'gender':userinfo[0][2]
    }
    # hmset第二個參數為字典
    r.hmset('user', user_dict)
    # 設置過期時間為5分鍾
    r.expire('user', 10)
    print('redis緩存成功')

mysql數據庫中數據更新信息后同步到redis緩存

import redis
import pymysql


# update數據(mysql)后,同步到redis緩存


def update_mysql(age, username):
  db = pymysql.connect('127.0.0.1', 'root', '123456', 'userdb', charset='utf8')
  cursor = db.cursor()
  upd = 'update user set age=%s where username=%s'
  try:
    # code:0 或者 1
    code = cursor.execute(upd, [age, username])
    db.commit()
    if code == 1:
      return True
  except Exception as e:
    db.rollback()
    print(e)
  cursor.close()
  db.close()

def update_redis(age):
  r = redis.Redis(host="127.0.0.1", port=6379, db=0)
  r.hset('user', 'age', age)
  print('已同步至redis')
  # 設置過期時間
  r.expire('user', 30)
  # 測試
  print(r.hget('user', 'age'))


if __name__ == '__main__':
  username = input('請輸入用戶名:')
  age = input('請輸入更該后的年齡:')
  if update_mysql(age, username):
    update_redis(age)
  else:
    print("用戶名有誤")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM