redis数据库的常用操作(python如何连接)
redis中文 官网:www.redis.com
redis英文官网:www.redis.io
redis是一个非关系型数据库
redis自带反垃圾系统,就是导入数据的时候不用考虑数据的重复性,直接往redis中导入即可,会自动去重
redis作用:
1、内存缓存,将常用的数据放到redis中
通常服务器前面都会放一个缓存数据库,常用的cache、redis、memcache,首先缓存数据库从mysql中获取常用的数据,然后用户访问的时候就从缓存数据库去匹配数据,达到减轻后端mysql服务器的压力
2、消息中间件
也可以作为生产者消费者模型,就是生产者将数据放到redis中,然后消费者从redis中取数据
关于redis的数据库
默认选择的是0号数据库,redis总共有16个数据库
查看数据库,vim redis.conf 中 databases 16 # 就是告诉你总共有16个数据库
the default databases is DB 0 #就是告诉你在0号数据库
select num # num就是0~16的任意数字,切换到指定的数据库
keys * # 查看当前数据库下所有的数据
move key db # 就是把当前数据库下的指定的数据移动到指定的数据库下,key就是当前数据库下数据列表的名字,db就是0~16数据库的一个数字
linux下的安装
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
mkdir redis # 创建一个redis的安装目录文件夹
cd redis # 进入安装目录
mv ../redis-5.0.4.tar.gz . # ..就是当前目录的上级目录,.就是当前目录,将上级目录的软件包复制到当前目录
tar xzf redis-5.0.4.tar.gz #解压安装包
cd redis-5.0.4 # 进入解压的文件夹
make # 编译
make install # 编译安装
src/redis-server # 启动服务(src/redis-server & 加了&就是后台执行,不会占用命令窗口)
ps aux | grep redis # 查看后台redis的端口号和进程号
src/redis-cli # 连接redis
安装后再src包下的一些文件用处
redis-server # 启动redis服务,默认端口6379,PID就是进程号
redis-cli # 连接redis服务的客户端工具
redis-check-rdb # 数据持久化的工具,就是数据落地的工具,同步到磁盘上,rdb是一种落地方式
redis-check-aof # 数据持久化的工具,就是数据落地的工具,同步到磁盘上,aof是另一种落地方式
redis-benchmark # redis压力测试工具
redis-sentinel # 哨兵机制,监控定位的作用,实际项目中会有多台redis,为什么有多台redis,就是如果一台挂了,其他的可以继续用,sentinel就是监控所有的redis,如果有一台挂了,那么sentinel就会把服务切换到另外的几台redis上
支持的数据结构有5种 # 重点面试题
1、字符串(strings)
2、链表(lists)
3、集合(sets)
4、有序集合(order set)
5、hash (列表)
字符串的操作
1、set key value ex(px) # 设置单个数据下的值超时时间,key就是设置的对象如name,value就是key下的值,ex是超时时间以秒为单位,px也是超时时间以毫秒为单位
2、get key # 获取值
3、MSET key value key value # 设置多个值,MSET后面可以跟多个key和value
4、mget key1 key2 key3 # 获取多个key值,mget后面可以跟多个key来取值
5、getset key value # 先获取当前的key值并返回,然后将后面的value赋值给当前的key,也就是更新当前key的值
6、incr key # key自增加1,应用场景登录时候输入次数限制,达到错误限制次数则10分钟后再登录,在redis里面同incr就可以实现
7、incrby key 10 # 在incr key的基础上增加数字
8、incrbyfloat key 10.4 # 在incr key的基础上增加浮点数
9、decr key # incr key 自减1,如果key是浮点数float则会报错,必须set num 回整型才能自减
10、decrby key num # 在incr key 的基础上减指定数字
链表操作
1、lpush key value # 从链表的左边去添加值,key就是链表名,value就是链表值可以是多个
2、lrange key start stop # 返回链表名中的值,start就是开始,stop就是结束,0 -1就是查看所有的值
3、llen key # 查看链表的长度
4、lindex key index # 返回链表名索引位的值,key就是链表名,index就是数字索引的位置
5、linsert key after value value # 在指定的链表的值的后面添加值,key就是链表名,value就是链表名下指定的值,value就是要插入的值
6、insert key before value value # 在指定的链表的值的前面添加值,key就是链表名,value就是链表名下指定的值,value就是要插入的值
集合的操作
这个集合如果是是一个社交网络就很有用,效率高
1、sadd key value... # 添加一个集合 ,key就是集合名,value就是集合中的元素,key后面可以跟多个value
2、smembers key # 查看集合中所有的成员,key就是集合名
3、sismember key value # 查看成员是否在集合中,key就是集合名,value就是查看的成员名
4、spop key # 弹出集合中的值,key就是集合名
5、scard key # 判断集合的长度,key就是集合名
6、sinter key1 key2 # 求两个集合的交集,key就是集合名
7、sunio key1 key2 key3 # 求多个集合的并集
8、sdiff key1 key2 # 求集合的差集
有序集合 order set
1、zadd key nx value... # 给集合设置一个数值,可以根据数值的大小给元素进行排序
2、zrank key value # 查看集合中指定值得排名
3、zrange key 0 -1 # 对指定的集合进行排序
4、zrange key 0 -1 withscores # 把集合的值包括数值全部打印出来
5、zcard key # 返回集合中的元素
6、zcount key min max # 查看指定集合中数值区间的值得数量,min最小的数值,max最大的数值
hash数据结构
1、hset key field value # key就是一个列表名字,field就是列表中的key,value就是值,将key和value组成了一个json格式的数据结构 info = {‘key’:'value,'key':'value'}
2、hget key field # 查看指定列表名的指定key的值
3、hgetall key # 获取指定列表名中所有的field和value
4、hdel key field # 删除指定列表中的key
5、hlen key # 返回指定列表的长度,有多少个值
6、hexists key field # 判断指定列表中有没有指定的key
7、hkeys key # 返回指定列表中所有的key
8、hvals key # 返回指定列表中key对应的所有value值
9、del key1 key2... # key就是列表名,删除指定列表,后面可以跟多个列表名
10、rename key newkey # 修改指定列表的名字,newkey就是新名字
python连接redis
1、pip3 install redis # 安装redis模块
2、vim redis.conf # linux下进入redis的目录下打开配置文件,然后找到protected-mode yes这一行,把yes改成no或者直接注释掉,其他的机器都能连
3、pkill redis # 杀掉redis的进程
4、src/redis-server & # 重启redis并在后台运行
5、src/redis-cli # linux下连接redis
python中要 import redis # 导入这个模块
1、r = redis.Redis(host='loaclhost',port=6379,password='',db=0) # 实例化,host就是redis物理机的地址,port就是端口,password就是密码如果没有则为空,db就是几号数据库
2、r.get(key) # 获取数据库下key的值,返回的值是在一个列表中
3、r.dbsize # 查看当前数据库下有多少条数据
4、r.delete('key') # 删除对象
5、r.set(‘key’,'value') # 增加对象并且添加值
6、r.save() # 将数据写回磁盘,保存时阻塞,成功返回True
7、r.flushdb() # 清空r中所有的数据
8、r.incr('key') # 对对象进行数值的自增
python中的pipeline操作 # pipeline 就是redis在提供单个请求中缓冲多条服务器命令的基类的子类,它通过减少服务器与客户端之间反复的TCP数据库包,从而大大的提高了执行批量命令的功能
p = r.pipeline() # 创建一个管道
p.set('strings key','value') # 创建一个字符串类型的对象名,并且添加值
p.sadd('sets key','value') # 创建一个集合并且添加值
p.incr('key') # 对指定的key进行数值自增
p.execute()
这一系列的指令可以写在一起 p.set('strings key','value').sadd('sets key','value').incr('key').execute()
连接redis错误信息
1、如果连接时候还是提示只能本机连,则在src/redis-server 这条指令后面跟一条指令--protected-mode no 即可
比如统计一个页面的点击数
r.set('visit:index:total',0) # 这个就是在Redis中创建一个对象是visit:index:total,然后value是0
r.incr('visit:index:total') # 每incr一次,value就会+1
如何保存一个对象数据
由于非关系型数据库没有固定的列,因此可以用hash类型保存多样化的对象,比如说保存用户的年龄,email,手机号等内容
r.hset('users:jim','name','jim') # users相当于mysql里面的那张表的概念,可以理解成表名,后面的jim就是代表jim这条记录,可以理解成jim这个对象,name就是这个对象下的value值,可以有多个值
r.hgetall('users:jim') # 取出jim这个对象所有的数据,是以json格式的数据格式返回
社交网站中用redis做推荐系统原则参考
通过圈子可以找到有共同特征的人,当一个用户加入一个或几个圈子后,系统可以向用户推荐这个圈子中的人
r.sadd('circle:game:lol','user:zhangsan') # 创建圈子并加入用户,circle:game:lol 这个表示游戏lol的圈子,user就是对象表示用户名,后面的value就是用户的名字或者账户
r.sadd('circle:soccer:InterMilan','user:lisi') # 创建一个足球圈子
r.smembers(‘circle:game:lol’) # 查看指定圈子中的所有数据
r.sinter('circle:soccer:InterMilan','circle:game:lol') # 查看两个圈子的交集,就是相同的人
redis中Pub和Sub可以构建实时的系统消息,比如实时聊天室,或者频道订阅的功能实现
r.subscibe news # 订阅news这个频道,此时程序会阻塞
r.publish news message # 想news这个频道发送消息,message就是内容
session 共享存入redis
我们可以把session存入redis,来进行共享
1、pip3 install diango-redis-session==0.5.6 # 安装session这个包
2、在django项目下的settings里面增加session包的配置
SESSION_ENGINE = 'redis_sessions.sessions' # 把session保存到哪个介质里
SESSION_REDIS_HOST = 'localhost' # 这个指定连接的地址
SESSION_REDIS_PORT = 6379 # 端口
SESSION_REDIS_DB = 4 # 这个就是指定第几号数据库
SESSION_REDIS_PASSWORD = '' # 这个指定密码,如果没有则为空
SESSION_REDIS_PREFIX = 'session' # 设置这个就是在保存的时候key自动保存成这个名字
3、在django的路由文件里配置 # urls.py里写路由
4、视图文件里要写代码 # views.py里面
def set_session(request):
'''保存session的函数'''
request.session['username'] = 'django' # 用户名
request.session['verify_code'] = '123456' # 密码
return HttpResponse('保存session成功')
def get_session(request):
'''获取session数据,程序会自动从redis中取出session然后解析出来'''
username = request.session.get('username') # 会自动连接上redis然后取出用户名
verify_code = request.session.get('verify_code') # 同上
text = 'username=%s,verify_code=%s'%(username,verify_code) # 拼接格式返回
return HttpResponse(text)