前言
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)
散列(hashes)
, 列表(lists)
, 集合(sets)
, 有序集合(sorted sets)
与范围查询, bitmaps
, hyperloglogs
和地理空间(geospatial)
索引半径查询。 Redis 内置了 复制(replication)
,LUA脚本(Lua scripting)
, LRU驱动事件(LRU eviction)
,事务(transactions)
和不同级别的 磁盘持久化(persistence)
, 并通过 Redis哨兵(Sentinel)
和自动 分区(Cluster)
提供高可用性(high availability)。
[TOC]
环境搭建
安装redis
centos安装redis过程如下
1 |
|
配置redis
刚刚的redis目录下会生成一个redis模板配置文件redis.conf,我们的配置可以基于此文件进行。配置过程如下:
1 | 新建目录,用于存放redis的配置文件 |
主要配置项如下
参数 | 值 | 说明 |
---|---|---|
daemonize | yes | 设置redis以守护进程模式运行 |
pidfile | /var/run/redis_端口号.pid | 设置redis的PID文件位置 |
port | 端口号 | 设置redis监听的端口号 |
dir | /var/redis/端口号 | 设置持久化文档的存放位置 |
bind | 默认127.0.0.1 | 禁用后,外网可访问,注意下面的属性 |
protected-mode | 默认yes | 禁止公网访问redis cache |
requirepass | 密码值 | 设置密码 |
注意:
当Redis 以守护进程的方式运行的时候,Redis 默认会把 pid 文件放在/var/run/redis.pid,可配置到其他地址,当运行多个 redis 服务时,需要指定不同的 pid 文件和端口【PID (Process ID):线程ID】
Redis3.2 之后加入的新特性Protected-mode 是为了禁止公网访问redis cache,加强redis安全的。它启用的条件,有两个:
- 没有bind IP
- 没有设置访问密码
设置开机自动启动redis
1 | ./utils/install_server.sh |
关闭开机自动启动redis
1 | 显示自动启动的redis设置情况 |
其他常用配置
1、防止background save db 不成功
1 | 修改linux内核配置 |
**解释:内核参数overcommit_memory **
它是 内存分配策略,可选值:0、1、2。
- 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
- 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
2、禁用linux内核特性transparent huge pages,关闭透明大页功能
1 | 对内存使用和延迟有非常大的负面影响 |
3、无需停机升级或重启 Redis 实例。
1 | 这个命令可以看到所有可以config配置的参数 |
4、redis-cli客户端中文乱码
1 | redis-cli --raw -a password |
redis基本类型
Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。
- 二进制安全的字符串
- Lists: 按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。
- Sets: 不重复且无序的字符串元素的集合。
- Sorted sets,类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。
- Hashes,由field和关联的value组成的map。field和value都是字符串的。这和Ruby、Python的hashes很像。
- Bit arrays (或者说 simply bitmaps): 通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。
- HyperLogLogs: 这是被用于估计一个 set 中元素数量的概率性的数据结构。
命名规则
redis的key可以用任何二进制序列,空字符串也可以,但是推荐统一风格,不过于简化也不过于复杂
object-key : id : field
如:
user:1000:name
user:1000:reply.to
公共方法
1 | 查看系统所有的变量 |
其他命令备忘
1 | 1、redis-cli执行命令报错,可以用auth命令输入密码 |
String类型
设置字符串的值
1 | 设置值 |
数据在限定时间存活
方法1:对存在的key设置过期时间
1 | set phone 110 |
方法2:设置值时同时指定过期时间
1 | set phone 110 ex 10 |
公共方法
1 | 得到剩余存活时间 |
原子递增减,重置
1 | 原子递增 |
其他补遗
decrby age -2 = incrby age 2
# 增加浮点数
incrbyfloat price 2.122
位操作
getbit key offset
setbit key offset value
bitcount key [start][end]
bitop operation destkey key[key …]
List类型
一般意义上讲列表就是有序元素的序列,数组实现跟列表实现的list,属性方面大不相同
列表list:头尾添加元素速度极快且相同,跟list到底有多少值无关
数组list:索引访问元素速度极快
Redis的列表类型(list)可以存储一个有序的字符串列表,通常的操作是向列表两端添加元素,或者获取列表的某一个片段。其内部使用双向链表(double linked list)实现的,所以两端添加元素的时间复杂度是O(1),获取越接近两端元素的速度就越快。快速访问集合元素能力不行
设置List值
1 | rpush向右侧末尾添加元素,显示添加后的list数量 |
异常情况
1 | 一个list一直弹,最后无元素可弹时,返回nil,且此时删除该键 |
列表常用命令
1 | rpush mylist 1 2 3 4 5 |
移除source列表最后一个元素,插入destination列表头部
rpoplpush source destination
brpoplpush source destination timeout # 阻塞版,0:代表无限期阻塞
1 | 示例 |
Hash类型
Redis Hset 命令用于为哈希表中的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,旧值将被覆盖。
返回值
如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。
1 | HSET KEY_NAME FIELD VALUE |
举例
1 | hset website google "google.com" |
2017-05-23 23:15 更新列表list命令用法,困了:-s睡觉去