赞
踩
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
国外的官方网站:https://redis.io/
(更新快)
国内的中文网站:http://www.redis.cn/
(相对于官方网站,更新慢)
Redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。
redis的基本用途:Redis能干嘛?
1、内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb、aof) 2、效率高,可以用于高速缓存 3、发布订阅系统 4、地图信息分析 5、计时器、计数器(浏览量)
基本概念的介绍:
1,redis也有数据库的概念,一个数据库中可以保存一组数据;
2,各个数据库之间是相互隔离的,当然也可以在不同数据库之间复制数据;
3,每一个数据库都有一个id号,默认的数据库id为0;
4,可以使用select命令选择当前使用的数据库:
5,redis初始化的时候会默认创建16个数据库(这个配置可以在redis配置文件中databases 16);
6,特别注意,类似redis的key-value数据库系统,是绝对没有表的概念,可以简单理解为,所有的数据都是乱七八糟的堆在一起的;
编号 | redis常见实用知识点 |
---|---|
1 | Redis采用单线程机制进行工作 |
2 | 使用select 数据库编号 可以切换使用的数据库 |
3 | dbsize 命令查看当前数据库key的数量 |
4 | keys * 命令查看当前数据库所有的key |
5 | flushdb 命令清空当前数据库 |
6 | flushall 命令清空所有数据库 |
7 | Redis中所有数据库使用同一个密码,默认没有密码,Redis认为安全层面应该由Linux来保证 |
8 | Redis中所有索引都是从0开始 |
9 | Redis默认端口是6379 |
从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单:官方网站
Redis的下载和安装详细步骤:
1、去官网下载redis-6.2.6.tar.gz安装包,并放入Linux中的/opt目录
2、然后通过FTP上传到/opt目录下,执行解压命令,指令如下所示:
tar -zxvf redis-6.2.6.tar.gz
3、解压完成后出现文件夹redis-6.2.6
4、进入文件夹redis-6.2.6,在此目录下执行安装的命令,展示如下:
./configure --prefix=/usr/local/test
基本流程:配置(configure)、编译(make)、安装(make install)
Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。
其中–prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。
./configure –prefix=/usr/local/test
可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。
make && make install
5、进入默认安装目录cd /usr/local/bin,此目录中有如下文件:
make成功后会在src文件夹下产生一些二进制可执行文件,主要包括redis-server、redis-cli等等,展示如下:
$ find . -type f -executable
./redis-benchmark # 用于进行redis性能测试的工具
./redis-check-dump # 用于修复出问题的dump.rdb文件
./redis-cli # redis的客户端
./redis-server # redis的服务端
./redis-check-aof # 用于修复出问题的AOF文件
./redis-sentinel # 用于集群管理
启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:
首先我们要知道redis的配置文件是在安装包那边提供的,并不是解压安装后的目录内,展示如下:
目录在/opt/redis-6.2.6/redis.conf,我们可以用vim进行打开进行打开,编辑:当然也可以使用宝塔面板,非常方便:
然后我们启动我们的redis-server服务器端的服务,记住后面要跟conf的路径。
[root@iZbp1cptoov44i876qmh8hZ bin]# ./redis-server /opt/redis-6.2.6/redis.conf 3027598:C 22 Feb 2022 17:30:45.591 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3027598:C 22 Feb 2022 17:30:45.591 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=3027598, just started 3027598:C 22 Feb 2022 17:30:45.591 # Configuration loaded 3027598:M 22 Feb 2022 17:30:45.592 * monotonic clock: POSIX clock_gettime _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 6.2.6 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 3027598 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | https://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 3027598:M 22 Feb 2022 17:30:45.593 # Server initialized 3027598:M 22 Feb 2022 17:30:45.594 * Loading RDB produced by version 6.2.6 3027598:M 22 Feb 2022 17:30:45.594 * RDB age 14 seconds 3027598:M 22 Feb 2022 17:30:45.594 * RDB memory usage when created 0.77 Mb 3027598:M 22 Feb 2022 17:30:45.594 # Done loading RDB, keys loaded: 0, keys expired: 0. 3027598:M 22 Feb 2022 17:30:45.594 * DB loaded from disk: 0.000 seconds 3027598:M 22 Feb 2022 17:30:45.594 * Ready to accept connections
我们也可以借助环境变量 redis-server,redis-cli 来进行执行,redis在make install 时候已经帮我们配置软连接了。
注意:这里直接执行redis-server 启动的Redis服务,是在前台直接运行的(效果如上图),也就是说,执行完该命令后,如果Lunix关闭当前会话,则Redis服务也随即关闭。
正常情况下,启动Redis服务需要从后台启动,并且指定启动配置文件。所以执行下面的配置。
修改/opt/redis-2.6.2/redis.conf配置文件,命令 vim redis.conf,将后台启动打开,即将daemonize选项由no置为yes:
查看redis进程:ps -ef|grep redis
默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379,而且这个6379的由来也非常有意思:而Merz全名Alessia Merz,是意大利的一位广告女郎,就是下面这位,在Antirez看来,这个名字是愚蠢的代名词,所以就选了这个6379,不过这位姑娘应该也不会关心IT技术圈的事,反而会被广大程序员知道了。
redis客户端的使用:
$ ./redis-cli # 这样来启动redis客户端了 或者 redis-cli
127.0.0.1:6379> set name "wristwaking" # 用set指令来设置key、value
OK
127.0.0.1:6379> get name # 来获取name的值
"wristwaking"
127.0.0.1:6379> shutdown # 通过客户端来关闭redis服务端
redis数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。
redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。
原子操作:最小的操作单位,不能继续拆分。即最小的执行单位,不会被其他命令插入。高并发下不存在竞态条件。
KEY的命名:一个良好的建议是article:520 : title
,来存储ID520的文章的标题。
注意:Redis采用键值对存储数据,key永远是String类型,五大数据类型指的是value部分
Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。
每个命令都代表着一种操作,有点类似mysql的命令。
redis命令大家没必要去记住,常见了解就行,忘记了就去官网查就行:
国内的中文网站:http://www.redis.cn/
(相对于官方网站,更新慢)
怎么来说,程序员用redis肯定是get、set为主,例如:正则查询键值对
127.0.0.1:6379> keys *t
# 遍历以t结尾的,*表示匹配任意多个字符
127.0.0.1:6379> keys na?e
# ?只匹配一个字符
127.0.0.1:6379> keys n*e
# * 匹配多个字符
127.0.0.1:6379> keys [a,b]*
# 匹配以字母a和b开头的key
scan cursor [MATCH pattern] [COUNT count]
27.0.0.1:6379> scan 0 match n* count 10 //count表示每次查询的key个数
scan 相比 keys 具备有以下特点 :
除 scan 字符串外:还有以下,他们的用法和scan 一样,具体参考官网: 官网
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和分值)。
Redis默认只能localhost登录,所以需要开启远程登录。
关键就是进行修改 redis.conf 配置文件:
1、将 bind 127.0.0.1 ::1 这一行注释掉。
2、将 bind 127.0.0.1 ::1 修改为 bind 0.0.0.0 (指所有的地址都可以访问)
这里的bind指的是只有指定的网段才能远程访问这个redis。 注释掉后,就没有这个限制了。或者 bind 自己所在的网段。
将 protected-mode 要设置成no (默认是设置成yes的, 防止了远程访问,在redis3.2.3版本后)
设置远程连接密码:取消注释 requirepass foobared,将 foobared 改成任意密码,用于验证登录。默认是没有密码的就可以访问的,我们这里最好设置一个密码。
最后进行重启 redis,如果不进行重启,我们的配置文件已经是旧的,所以要重启。
开启密码的权限后:客户端的连接 redis-cli,然后:127.0.0.1:6379> auth password 进行权限登录
eg:修改密码的方法
默认情况下 requirepass 参数是空的,这就意味着无需通过密码验证就可以连接到 redis 服务。可以通过以下命令来修改该参数:
127.0.0.1:6379> CONFIG set requirepass "mio" – mio 为密码
记住还要防火墙的开放6379的端口,想必大家都忘记了:
如果你用的宝塔面板,那么光服务器端那边防火墙开放还不够,宝塔这边也要进行开放6379,这是宝塔面板的保护机制,了解即可:
python连接redis数据库,借助的第三方库是redis,进行下载redis:
pip install redis -i 镜像源地址
pip的仓库一般都是在国外的服务器上,加了镜像源可以提供下载的速度。
常见pip镜像源(国内源)
清华:https://pypi.tuna.tsinghua.edu.cn/simple
豆瓣:http://pypi.douban.com/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
山东理工大学:http://pypi.sdutlinux.org/
华中理工大学:http://pypi.hustunique.com/
中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/
临时使用pip镜像源可以在使用pip的时候加参数:-i https://pypi.tuna.tsinghua.edu.cn/simple
若不进行pip进行快速安装,或者采用源码进行安装:
git clone https://github.com/andymccurdy/redis-py.git
cd redis-py
python setup.py install
redis提供两个类Redis和StrictRedis来实现Redis的命令操作。StrictRedis实现了绝大部分官方的命令,参数也互相对应,比如set()方法就对应Redis命令的set方法。
而Redis是StrictRedis的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将方法做了改写,比如lrem()方法就将value和num参数的位置互换,这和Redis命令行的命令参数不一致。
redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。
假设现在我们已经在服务器端装了Redis并运行在6379端口。那么,可以用如下示例连接Redis并测试:
Redis方式连接
import redis
# 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库
redis = redis.Redis(host='localhost', port=6379, decode_responses=True)
# host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379
redis.set('name', 'junxi')
# key是"foo" value是"bar" 将键值对存入redis缓存
print(redis['name'])
print(redis.get('name')) # 取出键name对应的值
print(type(redis.get('name')))
StrictRedis方式连接
from redis import StrictRedis
redis = StrictRedis(host='localhost', port=6379, db=0, password='foobared', socket_connect_timeout=1, decode_responses=True)
# decode_responses 开启bytes自动转默认编码的方式
# socket_connect_timeout = 1,设置连接超时
redis.set('name', 'Bob')
print(redis.get('name')) # b'Bob'
这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为localhost、6379、0和None。首先声明了一个StrictRedis对象,接下来调用set()方法,设置一个键值对,然后将其获取并打印。
Redis的五种数据结构的内部编码:type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构。
实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。
可以看到每种数据结构都有两种以上的内部编码实现,例如string数据结构就包含了raw、int和embstr三种内部编码。
们可以通过object encoding命令查询内部编码:
127.0.0.1:6379> set set:1 hello
OK
127.0.0.1:6379> object encoding set:1
"embstr"
127.0.0.1:6379> hset user:1 name kebi
(integer) 1
127.0.0.1:6379> object encoding user:1
"ziplist"
同时,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist就是hash、list和zset共有的内部编码。
Redis这样设计有两个好处:
第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令。
第二,多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。
我们在进行redis连接时候:decode_responses = True,目的就是自动进行转码
常见的操作介绍:redis 连接池操作:
from redis import StrictRedis
import redis
pool = redis.ConnectionPool(host='118.31.2.156', port=6379, password='wristwaking520', decode_responses=True)
redis = StrictRedis(connection_pool=pool)
有次在做浏览量排名的时候,传前端排序好的数据,那么就需要对字典进行排序(针对于字典的数值大小进行排序)展示如下:
按照字典值的大小对字典进行排序
利用zip函数将key值和value值位置进行颠倒,再使用sorted进行排序,例如:
from random import randint
d= {k:randint(0,20) for k in 'abcdefg'}
#{'f': 10, 'g': 16, 'a': 18, 'c': 12, 'e': 16, 'd': 7, 'b': 16}
z = list(zip(d.values(),d.keys()))
# zip函数就是将输入的序列重新组合成每个元素都是元组的列表,其中每个元素由输入序列相同位置的元素组成
#[(10, 'f'), (16, 'g'), (18, 'a'), (12, 'c'), (16, 'e'), (7, 'd'), (16, 'b')]
print(sorted(zip(d.values(),d.keys())))
#[(7, 'd'), (10, 'f'), (12, 'c'), (16, 'b'), (16, 'e'), (16, 'g'), (18, 'a')]
利用匿名函数进行排序
print(sorted(d.items(),key = lambda k : k[1]))
#[('d', 7), ('f', 10), ('c', 12), ('g', 16), ('e', 16), ('b', 16), ('a', 18)]
使用operator.itemgetter函数
import operator
print(sorted(d.items(), key=operator.itemgetter(1)))
#[('d', 7), ('f', 10), ('c', 12), ('g', 16), ('e', 16), ('b', 16), ('a', 18)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。