redis基本操作

为什么学习redis,前几天有个需求,用到了redis库,之前学习过但仅限于大学的时候,这个时候差不多忘光了,需求测的时候也是现学的几个查询指令。印象最深的是开发设计的时候存储了10个不同key值但value(list字符串)相同的数据,当时问过为什么要存十个,解释为 "为了防止频繁的访问一个key导致的热key问题,所以存储10个相同value的key,随机访问,分散压力"。后面查询资料才发现,频繁访问一个会导致CPU资源过载,内存资源紧张,负载不均衡等问题。

一.环境搭建

我是直接在网上下载的win redis-x64.zip压缩包,解压到本地后可以看到两个文件,一个是redis-server.exe redis服务启动程序,另一个是redis-cli.exe redis客户端操作程序。压缩包地址:https://pan.baidu.com/s/1t_NpWnE_qj4TvyESyvXYDA?pwd=4c0a 提取码:4c0a

二.基本使用

1.启动服务

复制代码
redis-server.exe redis.windows.conf  # 在解压目录下打开cmd,运行此命令

2.打开redis客户端连接

复制代码
redis-cli.exe  # 在解压目录下另外打开cmd,运行此命令,服务不要关闭

输入ping返回PONG即连接成功

ip默认本地ip,端口默认6379

3.切换库

复制代码
select index  # redis共有16个库,index为0-15,默认为0号库

4.设置key和value值

复制代码
set key value   # 设置key值和对应的value值
get key  # 通过key获取value值

5.停止服务

复制代码
shutdown

6.其它常用操作

dbsize:查看当前库key值数量

flushdb:删除当前库所有数据

exit:退出客户端连接

keys *:查看当前库所有key值(还可模糊匹配:*通配符,?占位符,例:*明*,*ming,li*)

exists key:判断key是否存在(例:exists name 存在返回1,不存在返回0)

expire key seconds:设置key过期时间(例如:expire name 30,设置name存活30s,30秒后key会失效删除)

ttl key:查询key剩余存活时间(-1 表示未设置存活时间,永久生效,-2已失效,存活时间已过,正数表示剩余存活时间)

type key:查询vaule数据类型

del key:删除key

append key value:在当前value末尾追加内容

strlen key:返回value长度

三.存储类型

1.string

字符串是Redis中最基本的数据类型,可以存储任何形式的字符串,包括数字、文本等

存储时使用:set key value(通过set存储的value都是string类型)

2.哈希(Hash)

哈希类型是一个键值对的集合,适用于存储对象类型的数据。每个哈希表可以包含多个字段和值,非常适合表示具有多个属性的数据对象

1)HSET key field value:设置哈希表字段的值。

2)HGET key field:获取哈希表字段的值。

3)HDEL key field:删除哈希表的某个字段

3.列表(list)

列表是一个双向链表,支持在列表的两端进行高效的插入和删除操作

1)声明一个key,value值为list的

复制代码
lpush namelist 'liming'  # 当key不存在时,创建一个key并赋予value值

2)添加多个vallue

复制代码
lpush namelist '2' '3'  # 默认在最左侧添加,即(['3','2','liming'])

3)根据下标查询value list值

复制代码
lrange namelist 0 100  # 查询namelist  key对于的value list中0-100的下标值

4)向list右侧添加value值

复制代码
rpush namelist 4 5  # 即['3','2','liming',4,5]

5)向右侧添加单个元素值

复制代码
 rpushx namelist 6  # 即[.......4,5,6],若key不存在则添加失败

6)向左添加单个元素值

复制代码
lpushx namelist 0  # 若key不存在则添加失败

7)通过下标获取对应的元素值

复制代码
lindex namelist 2

8)删除最左侧的值

复制代码
lpop namelist

9)删除最右侧的值

复制代码
rpop namelist

10)删除

复制代码
lrem namelist 0 4  # 删除list中值为4的全部元素
lrem namelist 2 4  # 删除list中第二个元素值为4的元素

11)查询list长度

复制代码
llen key

12)插入元素

复制代码
linsert key before 3 2  # 在3前插入2
linsert key after 3 2  #在3后插入2

4.集合(set)

集合是一种无序、不重复的数据类型。Redis提供了高效的集合操作,如求交集、并集、差集等

1)创建一个set类型的value值

复制代码
sadd set 4 5 6  # 赋予set的元素值有三个,4,5,6

2)查看全部的value值

复制代码
smembers set

3)判断value值是否存在

复制代码
sismember key value

4)判断元素个数

复制代码
scard key

5)删除元素

复制代码
 srem set 1,2,3 4 5  # 删除1,2,3  4  5三个元素值

5.有序集合(zset)

有序集合与普通集合类似,但每个元素都有一个关联的分数(score),Redis会根据分数对元素进行自动排序

1)ZADD key score member:向有序集合中添加元素并指定分数

复制代码
zadd age 1 2 2 3  # 添加两个元素2,3

2)ZRANGE key start stop:获取指定范围内的有序集合成员

复制代码
zrange age 0 100

3)ZREM key member:删除有序集合中的某个元素

复制代码
zrem age 4

四.python操作

1.安装redis库

复制代码
pip install redis

2.实例操作

复制代码
# pip install redis
import time

import redis

host = '127.0.0.1'  # redis服务地址
port = 6379  # redis服务端口

r = redis.StrictRedis(host=host, port=port, db=0, decode_responses=True)  # decode_responses=True设置true返回list类型,不设置返回字节
r.delete('age')  # 删除key
key = r.keys()  # 获取数据库所有的key,返回list
print(key)
r.set('python', 'python', ex=10)  # set(key,value,过期时间(ex设置的是秒,px设置毫秒))
time.sleep(3)
print(r.ttl('python'))  # 查询key剩余存活时间
r.set('python', 'pythoned', nx=True)
'''
nx=True当key值python不存在时,添加数据,存在则添加失败
xx=True 当key值python存在时,修改value值
'''

print(r.get('python'))  # 通过key获取value
print(r.dbsize())
r.quit()  # 关闭连接

操作方法和dos差不多,r为redis实例化对象,直接用r.的方式调用方法操作即可。

3.python实现随机访问key来避免频繁的访问一个key导致的热key问题

复制代码
import random

import redis

host = '127.0.0.1'  # redis服务地址
port = 6379  # redis服务端口

r = redis.StrictRedis(host=host, port=port, db=1, decode_responses=True)  # decode_responses=True设置true返回list类型,不设置返回字节
key_list = ['key0', 'key1', 'key2', 'key3', 'key4', 'key5', 'key6', 'key7', 'key8', 'key9']
for key in key_list:
    r.set(key, 1)
keys = r.keys()
a = random.choice(keys)
print(r.get(a))