简介:
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
常用命令:
就DB来说,Redis成绩已经很惊人了,且不说memcachedb和tokyocabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …
当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。
值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。
不介绍mc里面已经有的东东,只列出特殊的:
TYPE key — 用来获取某key的类型
KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)
RANDOMKEY - 返回随机的一个key
RENAME oldkeynewkey— key也可以改名
列表操作,精华
RPUSH key string — 将某个值加入到一个key列表头部
LPUSH key string — 将某个值加入到一个key列表末尾
LLEN key — 列表长度
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样
LTRIM key start end — 只保留列表中某个范围的值
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度
LSET key index value — 设置列表中某个位置的值
LPOP key
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了
集合操作
SADD key member — 增加元素
SREM key member — 删除元素
SCARD key — 返回集合大小
SISMEMBER key member — 判断某个值是否在集合中
SINTER key1 key2 ... keyN — 获取多个集合的交集元素
SMEMBERS key — 列出集合的所有元素
还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0。
存储:
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,
便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
安装:
获取源码、解压、进入源码目录
使用wget工具等下载:
wget (百度不让用链接)
tar xzf redis-1.2.6.tar.gz
cd redis-1.2.6。
编译生成可执行文件
由于makefile文件已经写好,我们只需要直接在源码目录执行make命令进行编译即可:
make
make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。
建立Redis目录(非必须)
这个过程不是必须的,只是为了将Redis相关的资源统一管理而进行的操作。
执行以下命令建立相关目录并拷贝相关文件至目录中:
sudo -s
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/var
cp redis-server redis-cli redis-benchmark redis-stat /usr/local/redis/bin/
cp redis.conf /usr/local/redis/etc/
配置参数
在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主要配置参数的意义:
daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
下面是一个略做修改后的配置文件内容:
daemonize yes
pidfile /usr/local/redis/var/redis.pid
port 6379
timeout 300
loglevel debug
logfile /usr/local/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis/var/
appendonly no
appendfsync always
glueoutputbuf yes
shareobjects no
shareobjectspoolsize 1024
将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下
然后在命令行执行:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
即可在后台启动redis服务,这时你通过
telnet127.0.0.16379
即可连接到你的redis服务
Redis常用内存优化手段与参数:
通过我们上面的一些实现上的分析可以看出redis实际上的内存管理成本非常高,即占用了过多的内存,作者对这点也非常清楚,所以提供了一系列的参数和手段来控制和节省内存,我们分别来讨论下。
首先最重要的一点是不要开启Redis的VM选项,即虚拟内存功能,这个本来是作为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但是其内存管理成本也非常的高,并且我们后续会分析此种持久化策略并不成熟,所以要关闭VM功能,请检查你的redis.conf文件中 vm-enabled 为 no。
其次最好设置下redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。
另外Redis为不同数据类型分别提供了一组参数来控制内存使用,我们在前面详细分析过Redis Hash是value内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map, 即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项:
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
hash-max-zipmap-entries
含义是当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,即value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。
hash-max-zipmap-value 含义是当 value这个Map内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。
以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是不是设置的越大越好呢,答案当然是否定的,HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果
成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好这个值的设置,总体上还是最根本的时间成本和空间成本上的权衡。
同样类似的参数还有:
[2]list-max-ziplist-entries 512
说明:list数据类型多少节点以下会采用去指针的紧凑存储格式。
list-max-ziplist-value 64
说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。
set-max-intset-entries 512
说明:set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
最后想说的是Redis内部实现没有对内存分配方面做过多的优化,在一定程度上会存在内存碎片,不过大多数情况下这个不会成为Redis的性能瓶颈,不过如果在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销,即在系统启动时先分配一个从1~n 那么多个数值对象放在一个池子中,如果存储的数据恰好是这个数值范围内的数据,则直接从池子里取出该对象,并且通过引用计数的方式来共享,这样在系统存储了大量数值下,也能一定程度上节省内存并且提高性能,这个参数值n的设置需要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值默认是10000,可以根据自己的需要进行修改,修改后重新编译就可以了。
另外redis 的6种过期策略[2]redis 中的默认的过期策略是volatile-lru 。设置方式
config set maxmemory-policy volatile-lru
maxmemory-policy 六种方式
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 是从所有key里 删除 不经常使用的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误
maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项)
摘自百度百科
分享到:
相关推荐
"redis-benchmarks-specification-0.1.8.tar.gz"文件是一个归档文件,采用tar加上gzip的压缩格式,这通常是Linux和开源社区常用的打包方式。解压后,我们可以得到"redis-benchmarks-specification-0.1.8"目录,里面...
1. **源代码**:如果是开源项目,可能会包含Java、Python、Node.js或其他语言的源代码,用于实现与Redis交互的会话管理逻辑。 2. **二进制文件**:编译好的可执行文件,可以直接在Windows环境下运行,无需额外编译...
### 内存数据库Redis概述与应用 #### 一、Redis简介 Redis是一种广泛使用的开源内存数据存储系统,它提供了一种高性能的键值存储解决方案。由于其基于内存的特点,Redis能够实现极高的读写速度,这使其成为构建高...
最常用的Python Redis客户端是`redis-py`,这是一个完全实现了Redis协议的Python库。安装可以通过`pip install redis`完成。 **连接Redis** 在Python中,你可以使用`redis.Redis()`创建一个Redis连接对象,传入...
Python 社区为其提供了多个客户端库,其中最常用的是 redis-py。这个压缩包包含了一个使用 redis-py 进行基本操作的代码示例,让我们详细探讨一下如何利用 redis-py 进行 Redis 操作。 首先,你需要安装 redis-py ...
Python中常用的Redis库是`redis-py`,它提供了一套完整的API来操作Redis。在编写分布式爬虫时,你需要理解如何使用这些API,例如`lpush`和`rpop`操作列表,`sadd`和`srem`操作集合,以及`hset`和`hget`操作哈希表。 ...
`redis-py`是官方推荐的Python客户端库,用于与Redis服务器进行交互。本教程将详细介绍如何使用Python的`redis-py`库封装一个名为`RedisHelper`的类,以便更方便地操作Redis。 首先,我们需要安装`redis-py`库。...
- **Python的redis-py**:Python社区广泛使用的Redis客户端库,提供易于使用的API。 - **Node.js的ioredis**:为Node.js设计的高性能Redis客户端,支持Promise和async/await语法。 - **Java的Jedis**:Java的...
- **MySQL数据库操作:** SQL语句的编写、Python与MySQL的数据交互。 - **正则表达式:** 使用Python的`re`模块进行字符串的模式匹配。 - **Web服务器与框架:** 了解HTTP协议、Web服务器的工作原理以及如何使用...
这个"Redis-x64-3.2.100.rar"文件是Redis的Windows 64位版本,适用于在Windows操作系统上部署Redis服务。 1. Redis简介: Redis是一个开源(BSD许可)的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。...
#### 五、Redis常用命令 ##### 3.1 键值相关命令 - **Keys**: 查找匹配给定模式的键。 - **Exists**: 判断给定键是否存在于数据库中。 - **Del**: 删除一个或多个键。 - **Expire**: 为给定键设置过期时间。 - **...
**PyPI 官网下载 | cdk8s_redis-0.1.17-py3-none-any.whl** CDK8s Redis 是一个基于 CDK8s 的 Python 库,用于在 Kubernetes 集群中便捷地管理和部署 Redis 数据库。这个资源是从 Python 的官方包索引(Python ...
Python库是Python开发者常用的一种工具,它们提供了各种功能,如数据处理、网络通信、图形界面等,极大地丰富了Python的生态系统。 关于indiredis库本身,虽然具体的功能没有在标题和描述中明确给出,但根据其名字...
总之,`redis-3.2.2.gem`是Ruby编程语言与Redis数据库交互的客户端库,它的正确安装是使用Ruby搭建和操作Redis集群的关键步骤。通过掌握如何安装和使用这个库,开发者可以充分利用Redis的强大功能,实现高效、可扩展...
`redisgraph-2.4.3.tar.gz` 是一个针对Python开发的库,主要用于利用Redis数据结构服务器构建图形数据库的应用。RedisGraph是Redis的一个模块,它提供了一种高效、功能丰富的图形数据库解决方案,支持复杂的查询操作...
3. Python 操作 Redis 的模块:Redis-py 是 Python 操作 Redis 的模块。 4. 如果 Redis 中的某个列表中的数据量非常大,如果实现循环显示每一个值?使用 Redis 的 SCAN 命令。 5. Redis 如何实现主从复制?以及数据...
在 Python 中,最常用的 Redis 客户端是 `redis-py`。该库提供了完整的 Redis 命令支持,并且支持管道操作、事务和发布/订阅等高级功能。 ##### 3.1 安装 `redis-py` 使用 pip 安装 `redis-py`: ```bash pip ...
而“哈希算法”可能指的是该包中实现了与Redis交互时使用的哈希函数,这种函数可以将任意大小的数据转化为固定长度的输出,常用在数据库索引、缓存存储等方面。 从压缩包子文件的名称列表来看,只有一个文件名`...
通过学习和实践这个案例,你可以掌握网络爬虫的基本流程和常用工具,为更复杂的爬虫项目打下坚实基础。同时,别忘了在爬取数据时遵守相关法律法规,尊重网站的Robots协议,做到合法、合规的爬取。
毕业设计项目“基于Scrapy-redis的分布式爬虫Web平台”是将Scrapy爬虫框架与Redis数据库结合,实现一个高效、可扩展的分布式爬虫系统。该项目利用SSM(Spring、SpringMVC、MyBatis)框架构建前端Web界面,提供用户...