首页 > 其他 > 详细

数据类型:Hash散列数据类型

时间:2019-08-06 21:24:15      阅读:92      评论:0      收藏:0      [点我收藏+]

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)
# 更改键名为"userinfo"的数据, 更改属性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("userinfo")
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、再次查询个人信息


r = redis.Redis(host=192.168.153.136,port=6379,db=0)

username = input(请输入用户名:)
# 如果redis中没有缓存,则返回空字典{}
result = r.hgetall(username)
print(redis中找到:,result)

# mysql中表字段: username、password、gender、age
if not result:
    db = pymysql.connect(172.0.0.1,root,123456,spider,charset=utf8)
    cursor = db.cursor()
    cursor.execute(select gender,age from user where username=%s,[username])
    # ((‘m‘,30),)
    userinfo = cursor.fetchall()
    if not userinfo:
        print(MySQL中用户信息不存在)
    else:
        dict = {
            gender:userinfo[0][0],
            age:userinfo[0][1]
        }
        # hmset第二个参数为字典
        r.hmset(username,dict)
        # 设置过期时间为5分钟
        r.expire(username,60*5)
        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("用户名有误")

 

数据类型:Hash散列数据类型

原文:https://www.cnblogs.com/maplethefox/p/11309472.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!