Redis必备基础知识
一.开启Redis数据库
1.设置redis.windows.conf
#443行,requirepass修改为:
requirepass [自己设置的密码]
2.开启服务与关闭服务
方法一:
#Redis作为服务启动,开启服务:
redis-server --service-start
#启动数据库,指定本地主机:
redis-cli.exe -h 127.0.0.1 -p 6379
#其他指令
关闭服务:redis-server --service-stop
卸载服务:redis-server --service-uninstall
方法二:
#开启服务,该cmd作为服务,一直运行,不可关闭
redis-server redis.windows.conf
#开打一个新的终端,启动数据库,指定本地主机:
redis-cli.exe -h 127.0.0.1 -p 6379
#关闭服务开启的cmd窗口则关闭了服务
3.设置密码
config set requirepass [你自己设置的密码]
4.端口号
Redis的端口号为:6379
二、Redis值的类型
Redis的6种数据类型
- String
- hash
- list
- set
- zset
针对这几种数据类型,数据库操作的全部命令
1.String字符串
Redis的最基本类型,最大能存储512M的数据。它的类型是二进制的,可以存储任何数据,如:数字、图片、序列化对象等。
一个key对应一个value
(1)设置键值
设置键值 | 语句 | 例子 |
---|---|---|
设置单个键值 | set key value | set name lyh |
设置多个键值 | mset key value[key value key …] | mset name lyh age 21 |
设置值及过期时间(单位:s) | setex key seconds value | setex age 10 21 |
查看有效时间 | ttl key | ttl age |
key不存在时才设置key值 | setnx key value | setnx name liyuhong |
(2)key的操作
key的操作 | 语句 | 例子 |
---|---|---|
根据键值获取值,不存在则返回None(null 0 nil) | get key | get name |
获取多个key值 | mget key1 [key2 …] | mget name age |
返回key种,字符串值的子字符 | getrange key start end | getrange name 0 2 |
修改key对应的value值,并返回旧value值 | getset key value | getset name liyuhong |
判断key是否存在 | exists key | exists name |
查看key对应的value类型 | type key | type name |
修改key的名称,当新的key名不存在时(与其他名称无冲突) | rename key newkey | rename name myname(当myname已存在,则不会发生修改) |
重命key名(冲突则覆盖,以新的key为准) | rename key newkey | rename name myname |
将key移动到指定的数据库 | move key dbnum | move name 1(将以name为key的键值对移动到库1中) |
随机返回一个key | rangdomkey | randomkey直接使用 |
与生存时间相关操作 | 语句 | 例子 |
---|---|---|
直接设置值及过期时间(单位:s) | setex key seconds value | setex age 10 21 |
设置已存在的key的过期时间(单位:s) | expire key seconds | expire name 10 |
查看有效时间(单位:s) | ttl name | ttl name |
查看有效时间(单位:ms) | pttl key | pttl name |
移除key的过期时间,将key持久化(ttl作废) | persist key | persist name |
删除key | 操作 |
---|---|
删除键及对应的值 | del key [key…] |
flushdb | 删除当前数据库中所有的key |
flushall | 删除所有数据库中的key |
(3)运算
条件:值是字符串类型的数字
运算 | 语句 | 例子 |
---|---|---|
将key对应的value值+1 | incr key | incr age |
将key对应的value值-1 | decr key | decr age |
将key对应的value值+整数 | incrby key intnum | incrby age 3 |
将key对应的value值-整数 | decr key intnum | decr age 3 |
(4)其他
其他用法 | 语句 | 例子 |
---|---|---|
字符串形式追加value的值 | append key value | append age 100 |
获取value长度 | strlen key | strlen name |
(5)key键的正则
key键的正则操作 | 语句 | 例子 |
---|---|---|
查询所有符合给定模式(正则)的key | keys * / keys *o* / keys t?? | ?匹配任意一个,*匹配0个1个多个 |
查询所有符合原子表的模式 | f[io]nd / f[^io] / f[a-z]nd | [xx]匹配任意一个xx,[^xx]匹配除xx以外,[x-y]匹配从x到y |
2.hash哈希
hash用于存储对象
{
name:liyuhong
age:21
}
Redis的hash是一个键值对的集合
(1)设置哈希值
操作 | 语句 | 例子 |
---|---|---|
设置单个值 | hset key field value | hset myinfo name liyuhong |
设置多个值 | hmset key field value [field value …] | hmset myinfo name lyh age 21 |
为哈希表key中指定的字段的整数值赋予增量increment | hincrby key field increment | hincrby myinfo age 10 |
字段field不存在时,设置哈希表字段的值 | hsetnx key field value | hsetnx myinfo name lyh |
(2)获取
操作 | 语句 | 例子 |
---|---|---|
获取一个属性的值 | hget key field | hget myinfo name |
获取多个属性的值 | hmget key field [field …] | hmget myinfo name age |
获取所有字段和值 | hgetall key | hgetall myinfo |
获取所有字段 | hkeys key | hkeys myinfo |
获取所有的值 | hvals key | hvals myinfo |
返回包含数据的个数 | hlen key | hlen myinfo |
(3)其他
操作 | 语句 | 例子 |
---|---|---|
判断字段是否存在,1存在,0不存在 | hexists key field | hexists myinfo name |
删除字段及值 | hdel key field [field] | hdel myinfo name age |
返回值的字符串长度 | hstrlen key field | hstrlen key name |
3.list列表
Redis列表是简单的字符串列表,按照插入顺序进行排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)
(1)设置列表
操作 | 语句 | 例子 |
---|---|---|
在头部插入 | Ipush key value [value …] | Ipush mylist 1 2 3 |
将一个值插入到已存在的列表头部,列表不存在,操作无效 | lpush key value | lpush mylist 4 |
在一个元素value1的前 / 后插入新元素value2 | linsert key before / after value1 value2 | linsert mylist before 3 77 |
在尾部插入 | rpush key value [value … | rpush mylist 5 6 7 |
为已存在的列表添加值 | rpush key value | rpushx mylist 9 |
更改索引对应的值 | lset index value | lset mylist 0 1(将索引0对应的值更改为1) |
返回列表中索引对应的值 | lindex key index | lindex mylist 0 |
(2)获取
操作 | 语句 | 例子 |
---|---|---|
移除并返回key对应的list的第一个元素 | lpop key | lpop mylist |
移除并返回key对应的list的最后一个元素 | rpop key | rpop mylist |
返回存储在key的列表中指定范围的元素 | lrange key start end | lrange mylist 0 -1(返回所有元素) |
(3)其他
其他操作 | 语句 | 例子 |
---|---|---|
裁剪列表,改为原列表的子集 | ltrim key strat end | ltrim mylist 1 -1 |
返回存储在key里的list的长度 | llen key | llen mylist |
4.set集合
无序集合,元素类型为string类型,具有:唯一性、不重复性、无序性
{a,b}
(1) 设置集合
操作 | 语句 | 例子 |
---|---|---|
创建集合、添加元素 | sadd key member [member …] | sadd myset a b c d |
(2)获取
操作 | 语句 | 例子 |
---|---|---|
返回key集合中所有元素 | smembers key | smembers myset |
返回集合元素个数 | scard key | scard myset |
返回 集合中一个或多个随机数 |
srandmember key [count] | srandmember myset(默认返回一个随机元素) |
随机移除 并返回集合中的一个元素 |
spop key | spop myset |
移除 集合中一个或多个成员 |
srem key member [member …] | srem myset a b c d |
3.集合中的其他操作
操作 | 语句 |
---|---|
求多个集合的交集 | sinter key1 key2 |
求多个集合的差集 | sdiff key1 key2 |
求多个集合的并集 | sunion key1 key2 |
判断元素是否在集合中,是1,不是0 | sismember key member |
5.zset 有序集合
概述:
- 有序集合,元素类型为String,元素具有唯一性
- 每个元素都会关联一个score(表示权重),通过权重的大小进行排序,元素的score是可以相同的
(1).设置
操作 | 语句 | 例子 |
---|---|---|
添加有序集合 | zadd key score member [score member …] | zadd myzset 1 a 2 c 3 b |
有序集合中对指定成员的权重增加incrememt | zincrby key incrememt member | zincrby myzset 1 a |
(2)获取
操作 | 语句 | 实例 |
---|---|---|
返回指定范围的元素 | zrange key start end | zrange myzset 0 -1 |
返回元素个数 | zcard key | zcard myzset |
返回有序集合key中,score在min和max之间的元素个数 | zcount key min max | zcount myzset 1 3 |
返回有序集合中,成员member的score值 | zscore key member | zscore myzset a |
其他:
在我们进入数据以后,默认存在0库中,可以通过select数据库编号(0-15)进行切换,这些编号的数据库都是固定的
三、持久化设置
Redis有两种持久化方案,RDB(Redis DataBase)和AOP(Append Only File)
RDB和AOF
RDB:是redis默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis重启会通过加载dump.rdb恢复数据。
AOF:默认不开启。他的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis重启会根据日志文件的内容,将写命令从前到后执行一次已完成数据的恢复工作
(1)RDB持久化设置
默认情况下,redis在磁盘上创建名为dump.rdb的数据快照的二进制格式文件,可以通过配置文件,配置:每个N秒且数据集上至少有M个变化时创建快照、是否对数据进行压缩、快照的名称、存放快照的工作目录等。redis默认配置如下:
900秒后且至少一个key发生变化时创建快照
save 900 1
300秒后且至少10个key发生变化时创建快照
save 300 10
60秒收 且至少10000个key发生变化时创建快照
save 60 10000
创建快照时 对数据进行压缩
rdbcompression yes
快照名称
dbfilename dump.rdb
(2)AOP持久化设置
利用快照的持久化方式不是很可靠,当运行Redis的计算机停止工作、意外断电、意外杀掉了Redis的进程,那么最近写入Redis的数据将会丢失。AOF方式是一个替代的方案,用以最大限度的持久化数据,通过redis.config进行开启还是关闭:
关闭aof
appendonly no
开启aof
appendonly yes
四、用python操作redis
1.安装、导入redis模块
# 安装
pip install redis
# 导入
import redis
2.连接方式
- StrictRedis实现大部分官方的命令。向后兼容旧版本的redis
- Redis是StrictRedis的子类
官方推荐使用StrictRedis
连接实例:
import redis
redis.Redis(host='127.0.0.1',password='密码',port=6379,db=0,decode_responses=True)
r = redis.StrictRedis(host='127.0.0.1',decode_responses=True)
print(r)
decode_responses=True获得的结果自动进行解码,否则,如果不添加参数,需要手动解码res.decode(‘utf-8’)
3.连接池connection pool
概述:
管理一个redis server的所有连接,避免每次建立、释放连接的开销,默认每个redis实例都会维护一个自己的连接池,可以直接建立一个连接池,作为参数传递给redis,这样可以实现多个redis共享一个连接池
实例:
pool = redis.ConnectionPool(pool='127.0.0.1',db=0,port=6379,decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r)
4. python操作字符串string类型
连接
import redis
r = redis.Redis(host='127.0.0.1',db=0,decode_responses=True)
(1)set设置值
r.set('name','liyuhong')
(2)get获取值
print(r.get('name'))
(3)批量设置值mset
r.mset(age=18,sex='男',hobby='写代码')
(4)批量获取值mget
r.mget('name','age','sex','hobby')
(5)设置新值,打印原值getset
print(t.getset('name','lyh'))
(6)返回对应值的长度strlen
print(r.strlen('name'))
(7)追加值append
r.append('age',1)
print(r.get('age'))
(8)查看类型type
print(r.type('name'))
5.python操作哈希hash类型
(1)设置hset
r.hset('myset','name','liyuhong')
(2)获取hget
print(r.hget('myset','name'))
(3)获取所有键值hgetall
print(r.hgetall('myset'))
(4)批量设置键值对 hmset
r.hmset('mset',{'name':'liyuhong','age':21})
(5)批量获取多个key的值 hmget
print(r.hmget('mset',['name','age']))
(6)获取hash中键值对的个数 hlen
print(r.hlen('mset'))
(7)获取hash中所有的key值 hkeys
print(r.hkeys('mset'))
(8)获取hash中所有的value值 hvals
print(r.hvals('mset'))
(9)检查当前的hash中是否有当前的key hexists
print(r.hexists('mset','name'))
(10)删除hash指定的key hdel
r.hdel('mset','name')
6.python操作列表list类型
(1)lpush从头部添加元素
r.lpush('list',1,2,3,4)
(2)rpush从尾部添加元素
r.rpush('list',5,6)
(3)llen获取元素的个数
r.llen('list')
(4)linsert在列表的某个值的前后插入一个新值
r.linsert('list','after',5,7)
name key值 / 前后before、after / 指定被插入的元素 / 插入的值
(5)lpop移除列表最左侧的一个元素并返回
print(r.lpop('list'))
(7)lindex根据索引获取列表的元素
print(r.lindex('list',0))
(8)lrange分片获取元素
print(r.lrange('list',0,-1))
7.python操作集合set类型
(1) sadd给name对应的集合添加元素
r.sadd('set','a','b','c')
(2)smembers获取集合中的所有元素
print(r.smembers('set'))
(3)sccard 集合中元素的个数
print(r.scard('set'))
(4)sdiff多个集合的差集
print(r.sdiff('set1','set2'))
(5)sinter 获取并集
print(r.sinter('set1','set2'))
(6)sismember检查当前的值是否是当前集合内的元素
print(r.sismember('set','a'))
(7)spop从集合的右侧删除一个元素
print(r.pop('set'))
8.python操作有序集合zset类型
(1)zadd添加元素
r.zadd('zset',a=1,b=2,c=3)
(2)zcard获取有序集合内元素的数量
print(r.zcard('zset'))
(3)zcount获取有序集合内,权重在min和max之间的个数
print(r.zcount('zset',0,-1)
(4)zrange返回一个范围内的元素
print(r.zrange('zset',0,-1))
(5)zscore获取元素所对用的权重
print(r.zscore('zset','c'))