Redis数据库简笔

0x00 简介

Redis是一个开源、免费、性能极高的Key-Value非关系型数据库。
Redis将数据保存于内存中,因此存取速度极快,效率极高。当然也可以将内存中的数据持久化到硬盘中,使用起来也非常方便。
——摘自《从零开始学scrapy网络爬虫(视频教学版)》

以下是Redis支持的重要数据类型:

字符串:String;
列表:List;
无序集合:Set;
有序集合:Sorted set;
散列表:Hash

0x01 下载安装(略)

0x02 配置Redis

安装后,可以修改配置文件以符合我们的实际需要。在Redis安装目录,找到并打开redis.windows-service.conf
每次连接时,可以通过select <dbid>命令选择一个不同的数据库,如果未指定,默认连接数据库db0。
配置文件更改后需要重启Redis服务才会生效。

1、配置可访问主机(bind)

bind 127.0.0.1    # 绑定本机
bind 127.0.0.1 192.168.64.100   # 绑定多个IP,ip之间用空格分开
bind 0.0.0.0    # 接受任何网络的连接

2、配置监听端口(port)

port 6379

3、配置密码(reqquirepass)

密码配置默认不启用,启用时只需将前面的注释符去掉。Redis执行速率极快,每秒可认证15W次密码,简单的密码很容易被攻破,所以最好使用一个复杂的密码。

requirepass password

4、配置超时时间(timeout)

如果客户端空闲超时,Redis服务器就会断开连接。默认为0,即服务器不会主动断开连接

timeout 0

5、配置Redis最大内存容量(maxmemory)

maxmemory <bytes>

当内存容量超过最大值时,则需要配合maxmemory-policy策略进行处理。可以选择以下几个方式:

  • volatile-lru:利用LRU算法移除设置过期时间的key。
  • volatile-random:随机移除设置过期时间的key。
  • volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)。
  • allkeys-lru:利用LRU算法移除任何key。
  • allkeys-random:随机移除任何key。
  • noeviction:不移除任何key,只是返回一个写错误。

6、配置数据库的数量(databases)

databases 16    # 默认

0x03 Python访问Redis

1、安装Redis库

pip install -U redis

2、连接Redis数据库服务器

redis-py库提供了两个类Redis和StrictRedis来实现Redis命令的操作。后者实现了大部分官方的语法和命令,而前者是后者的子类,用户向后兼容旧版本的redis-py,这里使用官方推荐的StrictRedis实现相关操作。

import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0, password='password')
# 将键值对存入redis缓存,key是“name”,value是"cathy"
r.set('name', 'cathy')
# 取出键name对应的值
print(r['name'])     	# b'cathy'
print(r.get('name'))	# b'cathy'

python3中,get()方法获取的是一个字节类型,如果想设置为字符串类型,可在初始化StrictRedis时,设置参数decode_responses=True(默认False,即Bytes型)。

"""使用连接池连接redis数据库"""
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, password='password', decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('name','cathy')
print(r.get('name'))      # cathy

3、字符串操作

字符串是Redis中最基本的键值对存储形式,在redis中是二进制安全的。字符串最大可容纳的数据长度为512MB。

improt redis
r = redis.StrictRedis(host='localhost',
					port = 6379,
					db = 0,
					password = 'password',
					decode_response = True)
r.set('name','cathy')
r.set('age',10)
r.setnx('height','1.50')   # 如果height不存在,则赋给值1.50
r.mset({"score1":100, "score2":98})   # 批量设置
r.mget(["name","age"])   # 批量获取
r.append(["name","good"])  # 向键为name的值后追加good
print(r.mget(["name", "age", "height", "score1", "socre2"]))

"""
结果
['cathygood', '10', '1.50', '100', '98']
"""

4、 列表操作

Redis中的列表是一个双向链表,可以在链表的左右分别操作。

improt redis
r = redis.StrictRedis(host='localhost',
					port = 6379,
					db = 0,
					password = 'password',
					decode_response = True)
r.lpush("student", "cathy", 10)  # 向键为student的列表头部添加值“cathy”和10
r.lpush("student", 1.50, "女")   # 向键为student的列表头部添加值身高和性别
print(r.range("student", 0, 3))  # 获取列表student中索引为0~3的列表
l.lset("student", 1, 9)          # 向键为student中索引为1位置赋值9
l.lpop("student")				 # 返回并删除列表student中的首元素
l.rpop("student")				 # 返回并删除列表student中的尾元素
l.llen("student")				 # 获取student列表长度
print(r.lrange("student", 0, -1))  # 获取列表student中所有数据

"""
['10', 'cathy', '1.5', '女']
['9', '1.5']
"""

如果列表不存在,则会创建一个空列表,添加的数据类型可以是bytes、string和number。

5、散列表操作

redis的散列表可以看成是具有key-value键值对的map容器。redis的key-value结构中,value也可以存储散列表,而key可以理解为散列表的表名。

improt redis
r = redis.StrictRedis(host='localhost',
					port = 6379,
					db = 0,
					password = 'password',
					decode_response = True)
# key=name,value=cathy的键值对添加到键为stu散列表中
r.hset("stu","name","cathy")
r.hmset("stu",{"age":10, "height":1.50})
r.hsetnx("stu", "score", 100)   # 如果score=100不存在则添加
r.hget("stu", "name")			# 获取散列表中key为name的值
r.hmget("stu", ["name", "age"])	# 获取散列表中多个key对应的值
r.hexists("stu", "name")		# 判断key为name的值是否存在,此处为True
r.hdel("stu", "score")    		# 删除key为score的键值对
r.hlen("stu")					# 获取散列表中键值对个数
r.hkeys("stu")					# 获取散列表中所有的key

6、有序集合操作

有序集合中每个元素都有一个与其相关联的浮点值,称为“分数”。
(A)如果元素A和元素B的“分数”不同,则按“分数”大小排序
(B)如果元素A和元素B的“分数”相同,则按元素A和元素B在字典中的顺序排列
下面看一个例子,将一些黑客名字添加到有序集合中,出生年份为其“分数”

improt redis
r = redis.StrictRedis(host='localhost',
					port = 6379,
					db = 0,
					password = 'password',
					decode_response = True)
# 将“Alan Kay”(分数为1940)添加到键为hackers的有序集合中
r.zadd("hackers",{"Alan Kay":1940})
r.zadd("hackers",{"Sophie wilson":1957, "Richard Stallman":1953})
r.zadd("hackers",{"Anita Borg":1953})
r.zadd("hackers",{"Hedy Lamarr":1914})
print(r.zrank("hackers", "Alan Kay"))			# 获取“Alan Kay”在有序集合中的位置(从0开始)
print(r.card("hackers"))						# 获取有序集合中元素个数
print(r.zrange("hackers", 0, -1))				# 获取有序集合中所有元素,默认按score从大到小顺序
print(r.z.revrange("hackers", 0, -1))			# 按score从小到大顺序获取有序集合中所有元素
print(r.zrangebyscore("hackers", 1900, 1950))	# 获取score为1900~1950之间的所有元素

"""
1
5
["Hedy Lamarr", "Alan Kay", "Anita Borg", "Richard Stallman", "Sophie wilson"]
["Sophie wilson", "Richard Stallman", "Anita Borg", "Alan Kay", "Hedy Lamarr"]
["Hedy Lamarr", "Alan Kay"]
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值