Redis学习笔记

Posted Brian Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习笔记相关的知识,希望对你有一定的参考价值。

1.什么是Redis

Redis 是一个开源的使用C语言编写,支持网络,可基于内存可持久化的日志型、高性能的Key-Value数据库,并支持多语言的API调用。它通常被成为数据结构服务器,因为Value值可以是多种数据类型(字符串(String)、集合(set)、列表(list)、哈希(Map)、有序集合(sorted set))等类型。

Redis的特点:

  • Redis支持数据持久化存储,可以将内存保存的数据持久化的存放到磁盘中,重启的时候可以在次的加载使用。
  • Redis不仅仅支持Key-Value类型的数据,还支持 字符串(String)、集合(set)、列表(list)、哈希(Map)、有序集合(sorted set)等多种数据类型。
  • Redis支持主从模式,即master-slave模式的主从模型。

Redis的优点:

  • 性能极高 (Redis能读的速度是110000次/s,写的速度是81000次/s)。
  • 支持丰富的数据类型 (Redis支持二进制案例的字符串(String)、集合(set)、列表(list)、哈希(Map)、有序集合(sorted set)等多种数据类型)。
  • 可用于缓存、消息、按key设置过期时间,过期自动删除。
  • 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
  • 支持分布式读写分离模式。

2.安装Redis(Linux)

2.1 下载Redis:

下载Redis安装包(下载地址:http://download.redis.io/releases/)

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

2.2 安装Redis:

解压、编译(编译的时候需要gcc的依赖 在安装之前一定保证gcc是安装好的,可以使用yum -y install gcc 安装)

[root@BrianZhu ~]# tar zxf redis-4.0.8.tar.gz 
[root@BrianZhu ~]# cd redis-4.0.8/
[root@BrianZhu redis-4.0.8]# make

2.3 启动Redis:

二进制文件是编译完成后在src目录下,通过下面的命令启动Redis服务:

[root@BrianZhu redis-4.0.8]# src/redis-server

看到下面的图片表示启动成功:

 这里的启动方式,是让Redis在前台启动,我们不退出Redis终端就会一直这样显示,当我们关掉终端Redis的进程也就退出了,为了解决这个问题 我们要把Redis放到后台启动,使用下面的方法:

[root@BrianZhu redis-4.0.8]# nohup src/redis-server &

检查Redis启动状态:

[root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      47592/src/redis-ser 
tcp6       0      0 :::6379                 :::*                    LISTEN      47592/src/redis-ser 

注:redis-server默认启动的端口是6379端口,默认没有密码

在启动的时候Redis调用的是配置文件redis.conf文件(文件路径在解压后redis目录下面)

[root@BrianZhu redis-4.0.8]# pwd
/root/redis-4.0.8
[root@BrianZhu redis-4.0.8]# ll | grep redis.conf
-rw-rw-r--  1 root root  58353 Feb  3 00:39 redis.conf

如果我们自定义的这个文件的路径,也可以指定这个文件的路径进行启动:

[root@BrianZhu redis-4.0.8]# nohup src/redis-server ~/redis-4.0.8/redis.conf &

2.4 启动Redis客户端并且验证:

我们可以使用内置的客户端命令redis-cli进行使用:

[root@BrianZhu redis-4.0.8]# src/redis-cli 
127.0.0.1:6379>                     # 已经启动Redis客户端

验证(一个简单的使用):

[root@BrianZhu redis-4.0.8]# src/redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set var "Hello World"
OK
127.0.0.1:6379> get var
"Hello World"
127.0.0.1:6379> 

退出客户端终端:

[root@BrianZhu redis-4.0.8]# src/redis-cli 
127.0.0.1:6379> quit
[root@BrianZhu redis-4.0.8]# src/redis-cli 
127.0.0.1:6379> exit

2.5 停止Redis:

我们可以使用内置的语法命令 redis-cli shutdown 来关闭Redis:

[root@BrianZhu redis-4.0.8]# src/redis-cli shutdown

具体操作如下:

[root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      47592/src/redis-ser 
tcp6       0      0 :::6379                 :::*                    LISTEN      47592/src/redis-ser 
[root@BrianZhu redis-4.0.8]# src/redis-cli shutdown
[1]+  Done                    nohup src/redis-server
[root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis
[root@BrianZhu redis-4.0.8]# 

注:如果是设置上密码后,单纯的使用redis-cli是关不掉的,必须加上IP、Port、Passwd

[root@BrianZhu redis-4.0.8]# src/redis-cli -h 192.168.31.1 -p 6379 -a 123456 shutdown

3.设置密码,远程连接

3.1设置Redis密码:

redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。

有两种设置密码的方式:

  • 修改配置文件,需要重启redis:在配置文件中有个参数: requirepass  这个就是配置redis访问密码的参数(500行左右);比如 requirepass test123 ;  注:( redis的查询速度是非常快的,外部用户一秒内可以尝试多大150K个密码;所以密码要尽量长(对于DBA 没有必要必须记住密码)

  

  • 使用内置的语法命令设置密码,不重启Redis设置密码:
[root@BrianZhu redis-4.0.8]# src/redis-cli 
设置密码
127.0.0.1:6379> config set requirepass test123
OK
查询密码:
redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted

密码验证:
redis 127.0.0.1:6379> auth test123
OK
再次查询:
redis 127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "test123"

注:如果配置文件中没添加密码 那么redis重启后,密码失效;

3.2 远程连接Redis:

远程连接也是有两种方式:

  • 登录的时候加上密码验证:
[root@BrianZhu redis-4.0.8]# src/redis-cli -p 6379 -a test123
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "test123"
127.0.0.1:6379> 
  •  登录以后在使用auth进行验证
[root@BrianZhu redis-4.0.8]# src/redis-cli 
127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth test123
OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "test123"
127.0.0.1:6379> 

注:AUTH命令跟其他redis命令一样,是没有加密的;阻止不了攻击者在网络上窃取你的密码;认证层的目标是提供多一层的保护。如果防火墙或者用来保护redis的系统防御外部攻击失败的话,外部用户如果没有通过密码认证还是无法访问redis的。

4.Redis的数据类型

Redis支持五种数据类型:

  • 字符串(String)
  • 集合(set)
  • 列表(list)
  • 哈希(Map)
  • 有序集合(sorted set)

4.1 字符串(String):

  • 是Redis最基本的数据类型,可以理解成与Memcached一样的类型,一个Key对应一个Value。
  • 二进制安全的。意思就是Redis的String可以包含任何数据,因为他是以二进制的方式存储的。
  • 一个键最大存储512MB。

常用字符串命令具体操作如下:

127.0.0.1:6379> set name "Brian Zhu"
OK
SET key value (给key赋值)
127.0.0.1:6379> get name
"Brian Zhu"
GET key (获取指定 key 的值)
127.0.0.1:6379> GETRANGE name 0 6
"Brian Z"
127.0.0.1:6379> GETRANGE name 0 -1
"Brian Zhu"
GETRANGE key start end (返回 key 中字符串值的子字符)
127.0.0.1:6379> GETSET name "Brian"
"Brian Zhu"
GETSET key value (将给定 key 的值设为 value ,并返回 key 的旧值(old value))
127.0.0.1:6379> GETBIT name 1
(integer) 1
127.0.0.1:6379> GETBIT name 3
(integer) 0
127.0.0.1:6379> GETBIT oo 1    # oo这个key不存在
(integer) 0
 
# 当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0
GETBIT key offset (对 key 所储存的字符串值,获取指定偏移量上的位(bit))
127.0.0.1:6379> MGET name
1) "Brian"
127.0.0.1:6379> mget name keys 
1) "Brian"
2) "hello world"
127.0.0.1:6379> mget name keys oo
1) "Brian"
2) "hello world"
3) (nil)

# 没有的变量返回nil
MGET key1 [key2..] (获取所有(一个或多个)给定 key 的值)
127.0.0.1:6379> SETBIT name 10086 1
(integer) 0
127.0.0.1:6379> GETBIT name 10086
(integer) 1
127.0.0.1:6379> GETBIT name 100   # 默认被初始为0
(integer) 0
SETBIT key offset value(对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit))
127.0.0.1:6379> SETEX test 60 brian
OK
127.0.0.1:6379> TTL test
(integer) 54
127.0.0.1:6379> GET test
"brian"
127.0.0.1:6379> TTL test
(integer) -2
127.0.0.1:6379> GET test
(nil)

#  设置时间过期,key对应的value也将过期
SETEX key seconds value (将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位))
127.0.0.1:6379> EXISTS job     # 查看job是否存在
(integer) 0 
127.0.0.1:6379> SETNX job "hahaha"   # 设置job
(integer) 1  
127.0.0.1:6379> SETNX job "nidaye"    # 覆盖job失败
(integer) 0
127.0.0.1:6379> GET job                   # 查看job值还是原来的值
"hahaha"
SETNX key value (只有在 key 不存在时设置 key 的值)
127.0.0.1:6379> GET job
"hahaha"
127.0.0.1:6379> SETRANGE job 2 "nidaye"  
(integer) 8
127.0.0.1:6379> GET job
"hanidaye"
SETRANGE key offset value(用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始)
127.0.0.1:6379> GET job
"hanidaye"
127.0.0.1:6379> STRLEN job
(integer) 8
STRLEN key(返回 key 所储存的字符串值的长度)
127.0.0.1:6379> mset key1 brian key2 18
OK
127.0.0.1:6379> get key1
"brian"
127.0.0.1:6379> get key2
"18"
MSET key value [key value ...](同时设置一个或多个 key-value 对)
127.0.0.1:6379> MSETNX key1 brian key2 19    # key1 和key2存在创建失败
(integer) 0
127.0.0.1:6379> MSETNX key3 jack key4 19
(integer) 1
127.0.0.1:6379> GET key3
"jack"
127.0.0.1:6379> GET key4
"19"
MSETNX key value [key value ...] (同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在)
127.0.0.1:6379> PSETEX test1 10000 "100000000"
OK
127.0.0.1:6379> PTTL test1
(integer) 8092
127.0.0.1:6379> GET test1
"100000000"
127.0.0.1:6379> PTTL test1
(integer) -2
127.0.0.1:6379> GET test1
(nil)
PSETEX key milliseconds value(这个命令和SETEX命令相似,但它以毫秒为单位设置 key的生存时间,而不是像 SETEX 命令那样,以秒为单位)
127.0.0.1:6379> SET number 100
OK
127.0.0.1:6379> INCR number
(integer) 101
127.0.0.1:6379> get number
"101"
INCR key(将 key 中储存的数字值增一)
127.0.0.1:6379> GET number
"101"
127.0.0.1:6379> INCRBY number 100
(integer) 201
127.0.0.1:6379> GET number
"201"
INCRBY key increment(将 key 所储存的值加上给定的增量值(increment)
127.0.0.1:6379> GET number
"201"
127.0.0.1:6379> INCRBYFLOAT number 100.9999
"301.99990000000000001"
127.0.0.1:6379> GET number
"301.99990000000000001"
INCRBYFLOAT key increment(将 key 所储存的值加上给定的浮点增量值(increment)
127.0.0.1:6379> GET number
"100"
127.0.0.1:6379> DECR number
(integer) 99
127.0.0.1:6379> GET number
"99"
DECR key(将 key 中储存的数字值减一)
127.0.0.1:6379> GET number
"99"
127.0.0.1:6379> DECRBY number 10
(integer) 89
127.0.0.1:6379> GET number
"89"
DECRBY key decrement(key 所储存的值减去给定的减量值(decrement)
127.0.0.1:6379> GET job
"hanidaye"
127.0.0.1:6379> APPEND job "niyade"
(integer) 14
127.0.0.1:6379> GET job
"hanidayeniyade"
127.0.0.1:6379> APPEND ll poip
(integer) 4
127.0.0.1:6379> GET ll
"poip"
APPEND key value(如果key已经存在并且是一个字符串,APPEND命令将指定value追加到改key原来的值(value)的末尾,key不存在则添加key)

4.2 集合(Set):

  • Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
  • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
  • 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

常用集合命令具体操作如下:

127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379>  SADD myset "hello"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "foo"
2) "hello"
SADD key member1 [member2] (向集合添加一个或多个成员)
127.0.0.1:6379> SCARD myset
(integer) 2
SCARD key (获取集合的成员数)
127.0.0.1:6379> SMEMBERS myset
1) "foo"
2) "hello"
127.0.0.1:6379> SMEMBERS brian
1) "foo"
2) "fo"
3) "nihao"
127.0.0.1:6379> SDIFF myset brian
1) "hello"
SDIFF key1 [key2] (返回给定所有集合的差集)
127.0.0.1:6379> SMEMBERS myset
1) "foo"
2) "hello"
127.0.0.1:6379> SMEMBERS brian
1) "foo"
2) "fo"
3) "nihao"
127.0.0.1:6379> SINTER myset brian
1) "foo"
SINTER key1 [key2] (返回给定所有集合的交集)
127.0.0.1:6379> SDIFFSTORE myset2 brian myset
(integer) 2
127.0.0.1:6379> SMEMBERS myset2
1) "fo"
2) "nihao"
SDIFFSTORE destination key1 [key2] (返回给定所有集合的差集并存储在 destination 中)
127.0.0.1:6379> SINTERSTORE myset3 brian myset
(integer) 1
127.0.0.1:6379> SMEMBERS myset3
1) "foo"
SINTERSTORE destination key1 [key2] (返回给定所有集合的交集并存储在 destination 中)
127.0.0.1:6379> SISMEMBER brian fo   # 存在
(integer) 1
127.0.0.1:6379> SISMEMBER brian do  # 不存在
(integer) 0
SISMEMBER key member (判断 member 元素是否是集合 key 的成员)
127.0.0.1:6379> SMEMBERS myset3
1) "foo"
127.0.0.1:6379> SMEMBERS myset
1) "foo"
2) "hello"
SMEMBERS key (返回集合中的所有成员)
127.0.0.1:6379> SMOVE myset foo foo
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello"
127.0.0.1:6379> SMEMBERS foo
1) "foo"
SMOVE source destination member (将 member 元素从 source 集合移动到 destination 集合)
127.0.0.1:6379> SMEMBERS brian
1) "foo"
2) "fo"
3) "nihao"
127.0.0.1:6379> SPOP brian
"nihao"
127.0.0.1:6379> SMEMBERS brian
1) "foo"
2) "fo"
SPOP key (移除并返回集合中的一个随机元素)
127.0.0.1:6379> SRANDMEMBER brian
"foo"
127.0.0.1:6379> SRANDMEMBER brian
"foo"
127.0.0.1:6379> SRANDMEMBER brian
"fo"
SRANDMEMBER key [count] (返回集合中一个或多个随机数)