zoukankan      html  css  js  c++  java
  • 数据类型: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("用户名有误")
  • 相关阅读:
    2021.4.14
    每日总结
    每日总结
    每日总结
    oracle db组面试 复习数据库
    二叉树根结点到叶节点的最短距离
    minheap 最小堆的实现
    Maximum element in a sorted and rotated array排序和旋转数组中的最大元素
    树和图bfs的一个共同点
    117. Populating Next Right Pointers in Each Node II 不完全二叉树连接右边节点
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11309472.html
Copyright © 2011-2022 走看看