数据类型: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("用户名有误")

 

posted @ 2019-08-06 20:55  maplethefox  阅读(2104)  评论(0编辑  收藏  举报