redis

Redis

网址

redis官方,网址1:https://redis.io/

redis安装软件,下载网址2:http://download.redis.io/releases/

redis使用文档命令,网址3:http://doc.redisfans.com/

redis,windows下安装软件包,网址4:https://github.com/dmajkic/redis/downloads

额外快餐(参考)

wget命令,下载文件的其他理解,参考1:https://www.cnblogs.com/peida/archive/2013/03/18/2965369.html

configure命令,编译,安装,其他理解,参考2:https://www.cnblogs.com/tinywan/p/7230039.html

 

安装

Linux系统

# 下载安装包 (-c 断点续传,-b 后台下载)

wget -c http://download.redis.io/releases/redis-4.0.1.tar.gz     

 # 解压

tar -xvf redis-4.0.1.tar.gz  

cd redis-4.0.1/         

# 修改要安装的目录路径,并编译,并开启安装

./configure --prefix=/usr/local/redis401 && make && make install           

# 这时候 Redis 程序已经被安装到 /usr/local/redis401/bin 目录

# 将配置文件移动到安装目录

mv redis.conf /usr/local/redis401/etc/redis.conf

# 启动Redis服务器(这里,用配置文件启动的Redis)

/usr/local/redis401/bin/redis-server /usr/local/redis401/etc/redis.conf

# 关闭Redis服务器

/usr/local/redis401/bin/redis-cli shutdown        或者   pkill redis-server

# 客户端,连接本机Redis服务器

/usr/local/redis401/bin/redis-cli

# 客户端,连接到指定主机Redis

/usr/local/redis401/bin/redis-cli -h 192.168.210.212 -p 6379

# 默认情况 Redis 不是在后台运行 , 如果需要把 Redis 放在后台运行 , 编辑配置文件

vim /usr/local/redis401/etc/redis.conf

# 将daemonize值改为yes

# 设置,Redis开机启动

vim /etc/rc.loacl     # 加上:/usr/local/redis401/bin/redis-server /usr/local/redis401/etc/redis.conf

# /usr/local/redis401/bin/ 目录下,几个文件概述:

redis-benchmark : Redis 性能测试工具
redis-check-aof : 检查 aof 日志的工具
redis-check-dump : 检查 rdb 日志的工具
redis-cli : 连接用的客户端
redis-server : Redis 服务进程

Redis的配置项,redis.conf,解析:

daemonize : 如需要在后台运行 , 把该项的值改为 yes
pdifile : 把 pid 文件放在 /var/run/redis.pid , 可以配置到其他地址
bind : 指定 Redis 只接收来自该 IP 的请求 , 如果不设置 , 那么将处理所有请求 , 在生产环节中最好设置该项
port : 监听端口 , 默认为 6379
timeout : 设置客户端连接时的超时时间 , 单位为秒
loglevel : 等级分为 4 级 , debug , revbose , notice 和 warning , 生产环境下一般开启 notice
logfile : 配置 log 文件地址 , 默认使用标准输出 , 即打印在命令行终端的端口上
database : 设置数据库的个数 , 默认使用的数据库是 0
save : 设置 redis 进行数据库镜像的频率
rdbcompression : 在进行镜像备份时 , 是否进行压缩
dbfilename : 镜像备份文件的文件名
dir : 数据库镜像备份的文件放置的路径
slaveof : 设置该数据库为其他数据库的从数据库
masterauth : 当主数据库连接需要密码验证时 , 在这里设定
requirepass : 设置客户端连接后进行任何其他指定前需要使用的密码
maxclients : 限制同时连接的客户端数量
maxmemory : 设置redis能够使用的最大内存
appendonly : 开启 appendonly 模式后 , Redis 会把每一次所接收到的写操作都追加到 appendonly.aof 文件中 , 当 Redis 重新启动时 , 会从该文件恢复出之前的状态
appendfsync : 设置 appendonly.aof 文件进行同步的频率
vm_enabled : 是否开启虚拟内存支持
vm_swap_file : 设置虚拟内存的交换文件的路径
vm_max_momery : 设置开启虚拟内存后 , Redis 将使用的最大物理内存的大小 , 默认为 0
vm_page_size : 设置虚拟内存页的大小
vm_pages : 设置交换文件的总的page数量
vm_max_thrrads : 设置 vm IO 同时使用的线程数量

Windows系统

# 网址4,下载软件压缩包

# 进行解压后,放到存放的安装目录下(如,D:\dev\redis-2.4.5)

# cmd,切换到该目录下,执行

redis-server.exe redis.conf 

# 安装完毕后,另开一个cmd窗口,依然该目录下,执行

redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456

# OK

Mac系统

homebrew安装

错误问题解决

# redis-cli  连接时,提示:
DENIED Redis is running in protected mode because protected mode is enabled..

# 解决:将配置文件里的 protected mode改为了 no , 原本是 yes 

# redis-cli 连接时,提示:

Connection refused...

# 解决:可能是配置文件里面的 bind 字段设置了入口 IP , 将其注释

 

Redis的理解

优点

  1. Redis是一个key-value存储系统: key为字符串类型,只能通过key对value进行操作。
  2. 支持多种数据结构类型(丰富)包括: string、list(双向链表)、set、zset(有序集合)和hash(hash表)。
  3. Redis支持主从同步,通过Replication进行数据复制,通过master-slave机制,数据可以从主服务器向任意数量的从服务器上同步。
  4. 支持持久化,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。----- Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。
  5. 仅支持单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
  6. 支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
  7. 支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点又是缺点。

局限性

  1. Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
  2. Redis在string类型上会消耗较多内存,可以使用hash(hash表)压缩存储以降低内存耗用。

其他

  1. 网络层:客户端和服务器通过 TCP 连接来进行数据交互,服务器默认的端口号为 6379,客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。
  2. 按统一请求协议,所有发送至 Redis 服务器的参数都是二进制安全(binary safe)的。

通俗来说

  1. 运行速度快。
  2. 用于缓存(内存数据库)
  3. 属于 nosql 数据库

使用

使用说明

一.服务器要先开启才能使用客户端

启动redis服务器: redis-server

进入redis客户端: redis-cli

二.说明

1. redis下,数据库是由一个整数索引标识,而不是由一个数据库名称,默认16个;

2. 每个redis-server 会有redis.conf,其中可以修改,数据库个数,端口,IP,日志...等所有设置;

3. 复制多个xx.conf文件,修改里面的port,启动的时候带上conf文件,就可以开启多个redis实例;

三.特点

不同的redis中key的类型,适用于不同的应用场景,很贴切生活需求.

 

命令

通用

select 1       切换至索引为1的数据库中

keys *         查看当前库所有的键(最常用)

type key       查看键的类型(最常用)

del key        删除redis中当前库中的键key,通用,key删除了,对应的值也就没了  -- 删多个:del key1 key2 ...

keys 'a*'       查看以a开头的键   '*b'   查看以b结尾的键

exists key       看键是否存在     存在1  不存在0

ttl key          查看键的有效期   永久-1  已到期销毁-2

flushdb         只会清除当前的数据库下的数据

flushall         清空redis数据库所有数据

clear/ctrl + l     清屏

 

127.0.0.1:6379>             库0,登录客户端,默认在库0中,而且不会显示当前库的编号

127.0.0.1:6379[1]>         库1,非库0的其他任何库,会端口的后边[1],会显示当前库的编号

tristadeMacBook-Air:~ trista$ redis-cli

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> select 2

OK

127.0.0.1:6379[2]> select 0

OK

127.0.0.1:6379> 

 

string

数据结构:一个键,仅仅对应一个值(字符串),每一个键都不同,是唯一的。

增改:-- set -- mset -- setex

set key value  增改,同时默认设置了有效期为永远

set key value ex seconds  增改,同时添加有效期

set key value px millliseconds 增改,同时设置有效期 -- px: 设置的是毫秒,如: px 5000 即,5000毫秒(5秒)

setex key seconds value  增改,同时添加有效期(expire:到期)

mset key1 value1 key2 value2 ... 多个键值对,这种默认都是有效期永远,mset命令没有设置有效期的参数

 

获取: -- get -- mget

get key

mget key1 key2 ... 获取多个键所对应的值

 

删除: -- del -- expire

del key1 key2 ...           删除多个键key,注意:这个命令,用于所有redis的键都可以,删除了键,值也就没了

expire key seconds      设置键的有效期(小于0即可,如:-1 -2 -3 ...),删除键  -- 和上边 ttl key 常搭配

 

hash

数据结构:一个键,对应值是一片区域:key:{field:value,field:value,...}

hash: 用于存储对象,对象结构:属性、值,值的类型:string

修改:-- hset -- hmset

hset key field value        设置区域的单个属性   -- field(字段)

hmset key field1 value1 filed2 value2 ...     设置域的多个属性(字段)

 

获取:-- hget -- hmget --  hkeys -- hvals

hget key field                   获取该键key的区域中一个属性值

hmget key field1 field2 ...          获取该键key的区域中多个属性值

hkeys key             获取该键key的区域中所有field属性名称(字段名称),~雷同:for key, value in hash.items()

hvals key              获取该键key的区域中所有属性值

 

删除:-- hdel

hdel key field1 field2 ...          删除多个属性值

del key1 key2 ...                     删除多个键key

list(双向链表 -> 队列、栈)

数据结构:一个键,对应值是一片区域:key:[value1, value2, ...]   

索引编号位置固定,所以在 "增加/删除" 元素时,每个元素的索引可能会发生变化!!!

结构是:左侧压入/右侧压入,或者插入,     ---  如同:电影院中,已经排好号的座位,等待着人入座.

索引是固定的,从左边往右排(0,1,2,...),值的类型:string

增加:-- lpush -- rpush -- linsert

lpush key value1 value2 ...         左侧压入数据   -- 特点:之前的元素索引会改变

rpush key value1 value2 ...         右侧压入数据   -- 类比:列表的append命令,特点:之前的元素索引没变

linsert key before oldvalue newvalue ...       指定key,旧元素前插入元素 -- 特点:oldvalue有重复时,以左边第一次出现为准

linsert key after oldvalue newvalue ...        指定key,旧元素后插入元素 -- 特点:oldvalue有重复时,以左边第一次出现为准

例子:

127.0.0.1:6379> lpush name xiaoming xiaohu xiaoxin

(integer) 3

127.0.0.1:6379> lrange name 0 -1

1) "xiaoxin"

2) "xiaohu"

3) "xiaoming"

127.0.0.1:6379> linsert name before xiaohu xiaohong

(integer) 4

127.0.0.1:6379> lrange name 0 -1

1) "xiaoxin"

2) "xiaohong"

3) "xiaohu"

4) "xiaoming"

 

获取:-- lrange --llen --lindex

llen key                  返回列表key的长度

lindex key index           返回列表key中,下标为index的元素

lrange key start stop        获取从索引start到stop位置的元素

如:lrange key 0 -1        查看该键对应值的全部value

注意:索引可以为负数,表示尾部(右侧)开始计数,...,-2,-1

 

修改:-- lset

lset key index value           修改指定索引index位置的元素值,index的值要小于当前列表key的长度

 

删除:-- lrem -- del

del key                将列表key删除

lrem key count value     将列表key中,前count次值为value的元素删除

count>0: 从头(左边)开始数

count<0: 从尾(右边)到头数

count=0: 查找所有value值的元素

 

裁剪:-- ltrim

ltrim key start stop    让列表只保留指定区间内的元素,其他元素删除,注意:留下的这些元素的索引会改变哦

 

弹出: -- lpop -- rpop

lpop key       执行一次,将列表key的头元素(index=0)弹出(移除)一个,如果在执行后,列表没有元素了,则列表key自动删除(该列表消失),注意:每次弹出元素后,其他的元素索引就发生了变化.

rpop key       同上,不过是尾元素

 

技术点:list实现队列、栈    (压入、弹出)

127.0.0.1:6379> lpush name wo_1 wo_2 wo_3 wo_4    # 左边压入

(integer) 4

127.0.0.1:6379> lrange name 0 -1

1) "wo_4"

2) "wo_3"

3) "wo_2"

4) "wo_1"

127.0.0.1:6379> lindex name 0

"wo_4"

127.0.0.1:6379> lpop name      # 后进先出:左边压入,左边弹出,即栈

"wo_4"

127.0.0.1:6379> lpop name

"wo_3"

127.0.0.1:6379> rpop name      # 先进先出:左边压入,右边弹出,即队列   -- 如:celery消息队列

"wo_1"

127.0.0.1:6379> lrange name 0 -1

1) "wo_2"

set

数据结构:一个键,对应值是一片区域:key:(member1, member2, ...)

无序集合,元素member唯一性,不重复,值的类型: string

增改:-- sadd

sadd key member1 member2 ...       向集合key中的区域中添加多个数据

smove key1 key2 member                将集合key1中的元素移动到key2中

注意:key1会删除该元素,key2如果已经有该元素,则不进行任何操作

 

获取:-- smembers -- scard

scard key                     获取集合key中的元素个数

smembers key             获取集合key中的区域内的所有元素

 

删除:-- srem

srem key member          删除集合key中区域内的指定元素

del key1 key2 ...             通用,删除key

 

弹出:--spop

spop key          移除并返回集合key中的一个随机元素,若执行一次后,集合中没有元素了,则删除集合key(消失)

 

-- 注意:交集、差集、并集,只是查询,并不会改变原来集合的数据

交集:-- sinter

sinter key1 key2 key3 ...     获取这些集合key1,key2,..的交集(都有的元素)

 

差集:-- sdiff

sdiff key1 key2 key3 ...   集合key1减去key1,key2的交集,获取返回剩下的差集kk1

注意,多个key:若有key3,则以此差集kk1减去kk1,key3的交集,获取返回的剩下差集kk2,以此类推...

 

并集:-- sunion

sunion key1 key2 ...       获取key1,key2,....这些集合的并集

zset

数据结构:一个键,对应值是一片区域:key: (score1: member1, score2: member2, ...)

有序集合,按权重score大小将成员排序,从而形成索引顺序,元素唯一性,不重复,值的类型:string

注意:权重score可以一样大小(可以重复),但成员不能重复,唯一的

特点:权重发生变化,排序索引也会随之变化.

场景:我自己当前脑海里先想到的就是,nginx的配置 -- 其中的权重配置模式.

增改:-- zadd

zadd key score1 member1 score2 member2 ...         向集合key中添加多个数据

注意:

1. 如果添加成员是原来就有的,则权重会覆盖(即,用最新的)-- 也就是:修改... ~_~

2. 如果添加成员不同之前,但权重一样,会在同样权重后插入,注意:及时,目前有3个同样权重的不同成员值,在使用zadd添加时,同样权重的待添加成员,也会插入在该权重第一次出现的成员后边,不会排在所有同权重成员后边.

 

获取:-- zrange -- zrangebyscore

zcard key                                       获取集合key中的成员数量

zrank key member                         获取集合key中该成员的排名(索引)

zrange key start stop                     获取指定范围内(索引,非权重)的member成员  -- 如:zrange key 0 -1

start, stop: 下标不是权重!!,0第一个成员,1第二个成员

注意:负数:....,-2,-1   -- 跟list类型中的lrange的索引使用,一个道理

 

zcount key min max                       获取集合key中score权重值间(包含)的成员数量 -- 闭区间:[min, max]

zrangebyscore key min max          获取集合key中score权重值间(包含)的成员值 -- 闭区间:[min, max]

zscore key member                       获取集合key中member成员对应

 

127.0.0.1:6379> zrange name 0 -1      # 查看所有成员

1) "xiaoming"

2) "zhongming"

3) "daming"

127.0.0.1:6379> zcard name

(integer) 3

127.0.0.1:6379> zscore name xiaoming     # 查看权重

"5"

127.0.0.1:6379> zrank name daming       # 查看排名,第三名

(integer) 2

127.0.0.1:6379> zrank name xiaoming     # 第一名

(integer) 0

 

删除:-- zrem -- zremrangebyscore

zrem key member1 member2 ...           删除集合key中指定的成员

zremrangebyscore key min max            删除集合key中指定权重范围内的成员 -- 闭区间:[min, max]

注意:删除了成员,对应的权重自然也消失,如果删除执行后,集合中没有成员了,那么集合key也会自动删除

Pub/sub(发布/订阅)

 

 

redis.conf(配置信息)

# 绑定的port

port 6379

# 绑定的IP (默认本机),若允许远程访问,则注释此行,解除绑定本机

bind 127.0.0.1

# 找到这一行,默认不是守护进程,会阻塞终端,改成yes,在后台运行,非阻塞(基本都会修改此配置,为yes)

daemonize no

# 这一行表示可持久化文件存储在dump.rdb文件中,可自定义文件名

dbfilename dump.rdb

# 修改持久化文件的存储路径,一般第一次安装都会自定义

dir /var/lib/redis

# 设置日志文件的路径,找到loglevel notice这一行,在其下面,redis默认不记录日志,一般开发者都会设置

logfile /var/log/redis/redis-server.log

# 设置密码(若需要),redis默认没有设置认证,grep -n requirepass redis.conf查看在哪一行,然后设置密码,取消requirepass foobared 的注释,将foobared的位置换成自己的密码,注意需要重启redis-server,redis-cli -h host -p port

requirepass 123456

# 不输入密码,不能进行读写操作

 

replication(复制 -- 主从)

查看官方文档:http://doc.redisfans.com/

文档中的,此模块详解,原理,配置等。

关键点:xxx.rdb文件 和 在持久化此文件期间的新写入命令。

配置从服务器,很简单,只需配置文件添加:

slaveof 192.168.1.1 6379   当然替换成主服务器的IP和端口号

 

因为 Redis 使用异步复制, 所以主服务器发送的写数据并不一定会被从服务器接收到, 因此, 数据丢失的可能性仍然是存在的。

 

配置主从(以ubuntu为例)

目前配置只改动过:daemonize yes     守护线程

 

配置主:

1. 查看主机ip: ifconfig -> 192.168.26.128

2. 修改配置:cd /etc/redis/redis.conf -> sudo vi redis.conf -> bind 192.168.26.128 -> port 6379

3. 重启主redis服务:sudo service redis stop -> redis-server redis.conf

 

配置从:(同一台电脑为例)

1. ip 省了;

2. 配置文件,复制一份并重命名:sudo cp redis.conf ./slave.conf

3. 修改配置:sudo vi slave.conf -> bind 192.168.26.128 -> slaveof 192.168.26.128 6379 -> port 6378

4. 启动从redis服务:sudo redis-server slave.conf

 

查看主从关系:redis-cli -h 192.168.26.128 info Replication

使用:

1. 进入主客户端:redis-cli -h 192.168.26.128 -p 6379

2. 主,写数据

3. 进入从客户端:redis-cli -h 192.168.26.128 -p 6378

4. 从,读数据

 

搭建集群(ubuntu为例)

1. 在Desktop 建 config 文件夹,内建6个 xxx.conf 空白文件,内部分别写上配置信息,形成配置文件 7000.conf -- 7005.conf

port 7000

bind 172.16.179.130

daemonize yes

pidfile 7000.pid

cluster-enabled yes

cluster-config-file 7000_node.conf

cluster-node-timeout 15000

appendonly yes

 

2. cd到桌面下的 config 目录下,加载配置文件分别启动6个redis服务

sudo redis-server xxx.conf

 

3. 查看进程:

ps aux | grep redis

常用命令:

ps aux | grep redis        查看redis服务器进程

sudo kill -9 pid           杀死redis服务器

sudo redis-server /etc/redis/redis.conf      指定加载的配置文件

 

4. redis的安装包中包含了redis-trib.rb,复制一份到本地的bin目录下,⽤于创建集群,在主电脑上,执行命令:

sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/

 

5. 安装ruby环境,因为redis-trib.rb是⽤ruby开发的

sudo apt-get install ruby

 

6. 创建集群命令:

 

redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005

 

6.1 执⾏上⾯这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本!

天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源;

 

查看下自己的 gem 源地址:

gem source -l      如果是https://rubygems.org/ 就需要更换

 

6.2 解决办法:

更换 gem 源指令:

gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/

 

通过 gem 安装 redis 相关依赖:

sudo gem install redis

 

6.3 重新输入创建集群命令即可:

01、注意:IP 这是当时的,自己配置用自己的;

02、过程中:提示是否创建 系统推荐的主从关系 输入 yes 即可;

 

7. 提示成功,搭建集群完成。

7.1 M - 主  S - 从

7.2 slots:0-5460 (5461 slots) master  slots: 槽点范围,数据存储,槽点在那个范围,就存在那个主服务器

 

 

使用集群:

1. 在172.16.179.131机器上连接7003,加参数-c表示连接到集群

redis-cli -h 172.16.179.131 -c -p 7003

 

2. 写入数据

set name zhangsan

 

3. Redirected to slot [5798] located at 172.16.179.131:7001  

表示 7003 从服务器只有读功能,写数据会自动跳转在一个主服务器上,跳在那个服务器上,按槽点来(slot[5798])来自动分配;

 

4. 读数据

get name

 

5. Redirected to slot [5798] located at 172.16.179.131:7001

表示 查找的内容 重定向在 7001 主服务上,并读数据,然后自动跳转到 7001 主客户端上

参考链接

官方文档:http://doc.redisfans.com/

 

你可能感兴趣的:(数据库,Redis)