Redis
Redis 是一个高性能的key-value数据库,支持主从同步。
配置文件
绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip
bind 127.0.0.1
端⼝,默认为6379
port 6379
是否以守护进程运⾏
如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
如果以⾮守护进程运⾏,则当前终端被阻塞
设置为yes表示守护进程,设置为no表示⾮守护进程
推荐设置为yes
daemonize yes
数据⽂件
dbfilename dump.rdb
数据⽂件存储路径
dir /var/lib/redis
⽇志⽂件
logfile "/var/log/redis/redis-server.log"
数据库,默认有16个
database 16
其他相关命令
清库命令
FLUSHDB——清除当前库
FLUSHALL——清除所有库
redis默认有db0~db15之多。
select 1 切换数据库
del
redis-server --help
ps aux | grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
redis-cli
数据操作
1、string类型
命令 | 例如 | 描述 |
---|---|---|
set key value | set name zhangsan | 设置键值(存在添加,不存在则修改) |
setex key secondes value | setex aa 3 aa | 设置键值及过期时间,以秒为单位 |
mset key1 value key2 value ... | mset a1 python a2 java a3 c | 设置多个键值 |
append key value | append a1 12345 | 追加值 |
get key | get 'a1' | 根据建获取值 |
mget key1 key2 ... | get a1 a2 | 根据多个键获取多个值 |
2、键命令
命令 | 例如 | 描述 |
---|---|---|
keys pattern | keys * | 查看所有键值(支持正则表达式 keys a*) |
exists key1 | exists a1 | 判断键是否存在,存在为1,不存在为0 |
type key | type a2 | 判断键所对应的value的值 |
del key1 key2 | del a1 a2 | 删除键及对应的值 |
expire key seconds | expire a3 5 | 设置过期时间为5秒 |
ttl key | ttl a3 | 查看有效时间(剩余多久过期) |
与Python交互
连接 Redis
import redis
连接方式:redis提供了2个方法
1:StrictRedis:实现大部分官方的命令
2:Redis:是StrictRedis的子类,用于向后兼容旧版的redis。
官方推荐使用StrictRedis方法。
举例(普通连接):
import redis
#decode_responses=**True** 自动解码
##### r = redis.Redis(host='127.0.0.1',port=6379,password='123456',db=0,decode_responses=**True**) #默认数据库为0
##### r = redis.StrictRedis(host='10.10.2.14',port=6379,password='123456',decode_responses=**True**)
连接池:connection pool
管理对一个redis server的所有连接,避免每次建立,释放连接的开销。默认,每个redis实例都会维护一个自己的连接池,可以直接建立一个连接池,作为参数传给redis,这样可以实现多个redis实例共享一个连接池。
举例(连接池):
pool = redis.ConnectionPool(host='127.0.0.1',port=6379,password='123456',decode_responses=**True**)
r = redis.Redis(connection_pool=pool)
一 STRING 字符串的操作
1. r.set 设置值
#在Redis中设置值,默认不存在则创建,存在则修改
r.set('name', 'zhangsan')
'''参数:
set(name, value, ex=None, px=None, nx=False, xx=False)
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
xx,如果设置为True,则只有name存在时,当前set操作才执行'''
2. r.get 获取值
r.get('name')
3. mset 批量设置值
#批量设置值
r.mset(name1='zhangsan', name2='lisi')
#或
r.mget({"name1":'zhangsan', "name2":'lisi'})
4. mget(keys, *args) 批量获取
#批量获取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))
5. getset 设置新值,打印原值
#设置新值,打印原值
getset(name, value)
print(r.getset("name1","wangwu")) #输出:zhangsan
print(r.get("name1")) #输出:wangwu
6. getrange 根据字节获取子序列
#根据字节获取子序列
getrange(key, start, end)
r.set("name","zhangsan")
print(r.getrange("name",0,3))#输出:zhan
7. setrange 修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
#修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
setrange(name, offset, value)
r.set("name","zhangsan")
r.setrange("name",1,"z")
print(r.get("name")) #输出:zzangsan
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #输出:zzangszzzzzzz
8. strlen(name) 返回name对应值的字节长度
#返回name对应值的字节长度(一个汉字3个字节)
r.set("name","zhangsan")
print(r.strlen("name")) #输出:8
9. incr 值的累加 amount为累加的值
#自增mount对应的值,当mount不存在时,则创建mount=amount,否则,则自增,amount为自增数(整数)
incr(self, name, amount=1)
print(r.incr("mount",amount=2))#输出:2
print(r.incr("mount"))#输出:3
print(r.incr("mount",amount=3))#输出:6
print(r.incr("mount",amount=6))#输出:12
print(r.get("mount")) #输出:12
10. append 在name对应的值后面追加内容
#在name对应的值后面追加内容
append(name, value)
r.set("name","zhangsan")
print(r.get("name")) #输出:'zhangsan
r.append("name","lisi")
print(r.get("name")) #输出:zhangsanlisi
11.type 查看类型
r.type(name)
案例
页面点击数
假定我们对一系列页面需要记录点击次数。例如论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。
当redis服务器启动时,可以从关系数据库读入点击数的初始值(1237这个页面被访问了34634次)
>>> r.set("visit:1237:totals",34634)
True
每当有一个页面点击,则使用INCR增加点击数即可。
>>> r.incr("visit:1237:totals")
34635
>>> r.incr("visit:1237:totals")
34636
页面载入的时候则可直接获取这个值
>>> r.get ("visit:1237:totals")
'34636'
Hash、List、Set、Zset及其他操作,后续需要持续更新!