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
127.0.0.1:6379> get name "Brian Zhu"
127.0.0.1:6379> GETRANGE name 0 6 "Brian Z" 127.0.0.1:6379> GETRANGE name 0 -1 "Brian Zhu"
127.0.0.1:6379> GETSET name "Brian" "Brian Zhu"
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 。
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
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
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也将过期
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"
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"
127.0.0.1:6379> GET job "hanidaye" 127.0.0.1:6379> STRLEN job (integer) 8
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"
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"
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)
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"
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"
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"
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"
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"
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"
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"
127.0.0.1:6379> SCARD myset (integer) 2
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"
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"
127.0.0.1:6379> SDIFFSTORE myset2 brian myset (integer) 2 127.0.0.1:6379> SMEMBERS myset2 1) "fo" 2) "nihao"
127.0.0.1:6379> SINTERSTORE myset3 brian myset (integer) 1 127.0.0.1:6379> SMEMBERS myset3 1) "foo"
127.0.0.1:6379> SISMEMBER brian fo # 存在 (integer) 1 127.0.0.1:6379> SISMEMBER brian do # 不存在 (integer) 0
127.0.0.1:6379> SMEMBERS myset3 1) "foo" 127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "hello"
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"
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"
127.0.0.1:6379> SRANDMEMBER brian "foo" 127.0.0.1:6379> SRANDMEMBER brian "foo" 127.0.0.1:6379> SRANDMEMBER brian "fo"