Python操作redis的方法
这篇文章将为大家详细讲解有关Python操作redis的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
python3操作redis
redis也被称为缓存
1.redis是一个key-value存储系统,没有ForeignKey和ManyToMany的字段。2.在redis中创建的数据彼此之间是没有关系的,所以也被称为是非关系型数据库。3.它支持存储包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)等数据类型。4.redis支持的数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。5.redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。6.redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
在正常的服务器中,redis是运行在内存中的,而数据库是运行在服务器的硬盘上的。
因为内存的运行速度远远快于硬盘的转速,所以redis查询速度远快于保存在硬盘的数据库。
同样,因为redis是保存在内存中的,一台服务器可以配置非常大的硬盘,相对于硬盘来说,服务器内存的配置容量远小于配置的硬盘容量,
所以redis有一定的容量限制,同样因为redis是保存在内存中的,所以服务器一旦断电,redis中保存的数据很容易丢失。
redis中存放的是常用的,且不经常更新的数据。
一台服务器刚上线的时候,用户访问服务器上的数据的时候,先去缓存中看看是否有要查询的数据。
如果缓存中保存有用户需要的数据,则直接从缓存中获取需要的数据;如果缓存中没有用户需要的数据,则会从数据库中查询数据并返回给用户,同时会把这些数据在内存中保存一份;这样下一位用户再来访问同样的数据时,则会直接从缓存中读取需要的数据,而不用访问数据库,加快了用户的访问速度。
例如,我们在博客园发表一篇博客时,在博客园的首页不会立即出现刚才所发表的那篇博客,而是要等几分钟之后,在博客园的首页才会出现刚才发表的那篇博客文章,这就是因为缓存的原因。
1.准备工作
为CentOS系统配置好epel源。
2.安装Redis
[root@bogonyum.repos.d]#yumlist|grepredisRepositorybaseislistedmorethanonceintheconfigurationRepositoryupdatesislistedmorethanonceintheconfigurationRepositoryextrasislistedmorethanonceintheconfigurationRepositorycentosplusislistedmorethanonceintheconfigurationredis.x86_643.2.10-2.el7@epelcollectd-redis.x86_645.7.1-2.el7epelcollectd-write_redis.x86_645.7.1-2.el7epelhiredis.x86_640.12.1-1.el7epelhiredis-devel.x86_640.12.1-1.el7epelopensips-redis.x86_641.10.5-3.el7epelpcp-pmda-redis.x86_643.11.8-7.el7basephp-nrk-Predis.noarch1.0.4-1.el7epelphp-pecl-redis.x86_642.2.8-1.el7epelphp-phpiredis.x86_641.0.0-2.el7epelpython-redis.noarch2.10.3-1.el7epelpython-trollius-redis.noarch0.1.4-2.el7epelpython2-django-redis.noarch4.3.0-1.el7epelredis-trib.noarch3.2.10-2.el7epelrubygem-redis.noarch3.2.1-2.el7epelrubygem-redis-doc.noarch3.2.1-2.el7epelsyslog-ng-redis.x86_643.5.6-3.el7epeluwsgi-logger-redis.x86_642.0.15-1.el7epeluwsgi-router-redis.x86_642.0.15-1.el7epel[root@bogonyum.repos.d]#yuminstall-yredisLoadedplugins:fastestmirror,langpacksRepositorybaseislistedmorethanonceintheconfigurationRepositoryupdatesislistedmorethanonceintheconfigurationRepositoryextrasislistedmorethanonceintheconfigurationRepositorycentosplusislistedmorethanonceintheconfigurationLoadingmirrorspeedsfromcachedhostfile*epel:ftp.cuhk.edu.hkPackageredis-3.2.10-2.el7.x86_64alreadyinstalledandlatestversionNothingtodo
3.redis的文件目录结构
使用rpm -ql命令查看redis安装之后在系统中生成的文件
[root@bogon~]#rpm-qlredis/etc/logrotate.d/redis/etc/redis-sentinel.conf#redis的守护配置文件/etc/redis.conf#redis的配置文件/etc/systemd/system/redis-sentinel.service.d/etc/systemd/system/redis-sentinel.service.d/limit.conf/etc/systemd/system/redis.service.d/etc/systemd/system/redis.service.d/limit.conf/usr/bin/redis-benchmark/usr/bin/redis-check-aof/usr/bin/redis-check-rdb/usr/bin/redis-cli#redis的交互式命令行界面/usr/bin/redis-sentinel#redis的守护文件/usr/bin/redis-server#redis的服务端启动文件/usr/lib/systemd/system/redis-sentinel.service#redis的守护程序的函数库文件/usr/lib/systemd/system/redis.service#redis的函数库文件/usr/libexec/redis-shutdown#停止redis的执行文件/usr/share/doc/redis-3.2.10#redis的帮助文件/usr/share/doc/redis-3.2.10/00-RELEASENOTES/usr/share/doc/redis-3.2.10/BUGS/usr/share/doc/redis-3.2.10/CONTRIBUTING/usr/share/doc/redis-3.2.10/MANIFESTO/usr/share/doc/redis-3.2.10/README.md/usr/share/licenses/redis-3.2.10#redis的licenses说明/usr/share/licenses/redis-3.2.10/COPYING/usr/share/man/man1/redis-benchmark.1.gz#redis的man文件/usr/share/man/man1/redis-check-aof.1.gz/usr/share/man/man1/redis-check-rdb.1.gz/usr/share/man/man1/redis-cli.1.gz/usr/share/man/man1/redis-sentinel.1.gz/usr/share/man/man1/redis-server.1.gz/usr/share/man/man5/redis-sentinel.conf.5.gz/usr/share/man/man5/redis.conf.5.gz/var/lib/redis#redis的持久化文件保存路径/var/log/redis#redis的日志文件/var/run/redis#redis的进程PID文件
4.redis的启动停止与状态查看
[root@bogon~]#systemctlstatusredis.service#查看redis的状态,可以看到是活动状态●redis.service-Redispersistentkey-valuedatabaseLoaded:loaded(/usr/lib/systemd/system/redis.service;disabled;vendorpreset:disabled)Drop-In:/etc/systemd/system/redis.service.d└─limit.confActive:active(running)sinceThu2017-11-1617:29:39CST;1min44sagoProcess:6272ExecStop=/usr/libexec/redis-shutdown(code=exited,status=0/SUCCESS)MainPID:6286(redis-server)CGroup:/system.slice/redis.service└─6286/usr/bin/redis-server0.0.0.0:6379Nov1617:29:39bogonsystemd[1]:StartedRedispersistentkey-valuedatabase.Nov1617:29:39bogonsystemd[1]:StartingRedispersistentkey-valuedatabase...[root@bogon~]#systemctlstopredis.service#停止redis[root@bogon~]#systemctlstatusredis.service#redis牌非活动状态●redis.service-Redispersistentkey-valuedatabaseLoaded:loaded(/usr/lib/systemd/system/redis.service;disabled;vendorpreset:disabled)Drop-In:/etc/systemd/system/redis.service.d└─limit.confActive:inactive(dead)Nov1617:21:56bogonsystemd[1]:redis.service:controlprocessexited,code=exitedstatus=1Nov1617:21:56bogonsystemd[1]:Unitredis.serviceenteredfailedstate.Nov1617:21:56bogonsystemd[1]:redis.servicefailed.Nov1617:22:04bogonsystemd[1]:StartedRedispersistentkey-valuedatabase.Nov1617:22:04bogonsystemd[1]:StartingRedispersistentkey-valuedatabase...Nov1617:29:39bogonsystemd[1]:StoppingRedispersistentkey-valuedatabase...Nov1617:29:39bogonsystemd[1]:StartedRedispersistentkey-valuedatabase.Nov1617:29:39bogonsystemd[1]:StartingRedispersistentkey-valuedatabase...Nov1617:31:38bogonsystemd[1]:StoppingRedispersistentkey-valuedatabase...Nov1617:31:38bogonsystemd[1]:StoppedRedispersistentkey-valuedatabase.[root@bogonyum.repos.d]#redis-server#启动redis程序5587:C16Nov15:42:56.010#Warning:noconfigfilespecified,usingthedefaultconfig.Inordertospecifyaconfigfileuseredis-server/path/to/redis.conf5587:M16Nov15:42:56.018*Increasedmaximumnumberofopenfilesto10032(itwasoriginallysetto1024)._.__.-``__''-.__.-```.`_.''-._Redis3.2.10(00000000/0)64bit.-``.-```.```\/_.,_''-._(',.-`|`,)Runninginstandalonemode|`-._`-...-`__...-.``-._|'`_.-'|Port:6379|`-._`._/_.-'|PID:6519`-._`-._`-./_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|http://redis.io`-._`-._`-.__.-'_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|`-._`-._`-.__.-'_.-'_.-'`-._`-.__.-'_.-'`-.__.-'`-.__.-'5587:M16Nov15:42:56.022#WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128.5587:M16Nov15:42:56.022#Serverstarted,Redisversion3.2.105587:M16Nov15:42:56.022#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect.5587:M16Nov15:42:56.025#WARNINGyouhaveTransparentHugePages(THP)supportenabledinyourkernel.ThiswillcreatelatencyandmemoryusageissueswithRedis.Tofixthisissuerunthecommand'echonever>/sys/kernel/mm/transparent_hugepage/enabled'asroot,andaddittoyour/etc/rc.localinordertoretainthesettingafterareboot.RedismustberestartedafterTHPisdisabled.5587:M16Nov15:42:56.026*Theserverisnowreadytoacceptconnectionsonport6379[root@bogon~]#systemctlstatusredis.service●redis.service-Redispersistentkey-valuedatabaseLoaded:loaded(/usr/lib/systemd/system/redis.service;disabled;vendorpreset:disabled)Drop-In:/etc/systemd/system/redis.service.d└─limit.confActive:active(running)sinceThu2017-11-1617:31:47CST;2sagoMainPID:6325(redis-server)CGroup:/system.slice/redis.service└─6325/usr/bin/redis-server0.0.0.0:6379Nov1617:31:47bogonsystemd[1]:StartedRedispersistentkey-valuedatabase.Nov1617:31:47bogonsystemd[1]:StartingRedispersistentkey-valuedatabase...
redis的启动方式有两种:
[root@bogon~]#systemctlstartredis.service#后台启动,无欢迎界面[root@bogon~]#redis-server#前台启动,可以看到欢迎界面
redis的停止方式有两种:
[root@bogon~]#systemctlstopredis.service[root@bogon~]#/usr/libexec/redis-shutdown
5.redis的主配置文件说明
bind127.0.0.1#redis绑定的主机地址,这里默认仅支持本地连接protected-modeyes#是否以保护模式运行redisport6379#指定redis监听的端口tcp-backlog511timeout0#客户端闲置多长时间后关闭连接,为0时关闭该功能tcp-keepalive300#tcp方式最大允许的连接数daemonizeno#是否以守护进程方式运行supervisedno#不使用监控树pidfile/var/run/redis_6379.pid#redis运行时保存pid的文件loglevelverbose#日志文件的记录方式,默认为标准输出logfile/var/log/redis/redis.log#redis日志文件的保存路径databases16#系统中保存redis数据库的数量save9001#redis中900秒之内有1次更新操作时,把数据同步到文件中保存save30010#redis在300秒内有10次更新操作时,把数据同步到文件中保存save6010000#redis在60秒内有10000次更新操作时,把数据同步到文件中保存stop-writes-on-bgsave-erroryesrdbcompressionyes#redis中的数据保存到本地数据库时是否启动压缩,默认为yesrdbchecksumyesdbfilenamedump.rdb#本地数据库的文件名dir/var/lib/redis#本地数据库的路径slave-serve-stale-datayesslave-read-onlyyesrepl-diskless-syncnorepl-diskless-sync-delay5repl-disable-tcp-nodelaynoslave-priority100appendonlyno#是否在每次更新操作时进行日志记录appendfilename"appendonly.aof"#指定更新日志的文件名appendfsynceverysec#每秒钟把redis中的数据同步到本地文件一次no-appendfsync-on-rewritenoauto-aof-rewrite-percentage100auto-aof-rewrite-min-size64mbaof-load-truncatedyeslua-time-limit5000slowlog-log-slower-than10000slowlog-max-len128latency-monitor-threshold0notify-keyspace-events""hash-max-ziplist-entries512hash-max-ziplist-value64list-max-ziplist-size-2list-compress-depth0set-max-intset-entries512zset-max-ziplist-entries128zset-max-ziplist-value64hll-sparse-max-bytes3000activerehashingyesclient-output-buffer-limitnormal000client-output-buffer-limitslave256mb64mb60#client-output-buffer-limitpubsub32mb8mb60hz10aof-rewrite-incremental-fsyncyes
6.redis的交互式界面
[root@bogon~]#redis-cli#进入redis的交互式界面127.0.0.1:6379>
可以看到,已经进入到redis的交互环境了
127.0.0.1:6379>setk1v1#设定k1这个键的值为v1OK127.0.0.1:6379>getk1#获取k1的值"v1"127.0.0.1:6379>setk2v2#设定k2的值为v2OK127.0.0.1:6379>getk2#获取k2的值"v2"
7.python3操作redis
在linux系统中打开redis的配置文件/etc/redis.conf
把第61行修改为
bind0.0.0.0
表示所有的主机都可以连接
然后重启redis,使配置文件生效
[root@bogon~]#systemctlrestartredis.service
在windows系统中,安装redis模块
pip3installredis
新建redis_test.py文件,文件内容为:
importredisr1=redis.Redis(host="192.168.16.220",port=6379)print("第一次读取的k1值:",r1.get("k1"))print("第一次读取的k2值:",r1.get("k2"))r1.set("k3","v3")r1.delete("k1")r1.delete("k2")print("第二次获取k1的值",r1.get("k1"))print("第二次获取k2的值",r1.get("k2"))print(r1.get("k3"))
运行结果:
第一次读取的k1值:b'v1'第一次读取的k2值:b'v2'第二次获取k1的值None第二次获取k2的值Noneb'v3'
再次在linux的命令提示符下获取k1和k2的值
127.0.0.1:6379>getk1(nil)127.0.0.1:6379>getk2(nil)
因为k1和k2的值已经在redis_test.py中被删除了,所以获取到的值为None.
8.使用Redis的好处
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
关于Python操作redis的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。