redis
是一种支持Key-Value等多种数据结构的存储系统。可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串、哈希、列表、队列、集合结构直接存取,基于内存,可持久化。
曾经走过的坑(可以不看下面,但是这一段我感觉是最用心的):
1
曾经沉迷在Linux上搭建环境,曾经在Linux上搭建了个MySQL和java web的环境并且成功跑起来,开心了好几天,但是实际生活中我感觉写代码比搭建环境更重要,何况你既然能看到我的文章就说明不是大牛,那你搭建的环境就是自己玩玩算了,把重心用在写代码上
2
怎么搭建redis环境(敲黑板,重中之重)
1) 首先你要有一个能联网,能连接的Linux系统
2)我用的是宝塔界面 ,官方URL:宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 我很笨,我都能用,但是这个插件是真的棒,就是是在Linux上安装一个安装软件的图形界面,类似手机的应用宝
如果你用的是阿里云服务器,并且你安装了宝塔插件,你需要修改阿里云的安全组,还需要修改宝塔面板的安全选项,才能开放端口,见下面图片
如果你是虚拟机,那就要开端口6379,在宝塔面板也配置一下,见下面图片
3
我曾经会遇到 一些可以事件解决的问题,却拼命的看博客自己推理,就像这个语法区分大小写吗,试试就知道了,试试就知道了,试试就知道了
4
学习知识的时候不要太追求完美,比如java里面的String的类,里面有很多分割字符串的方法,没必要全都试一遍,用到在查自然就会了,刚开始学习知识的时候把最常用的学会了我感觉就很棒了
搭建环境(用宝塔面板)
阿里云服务器搭建redis
修改安全组
修改redis的配置文件
修改redis的密码为 123456(下图是修改以后的)不要看行数,看大体位置
修改运行在别的主机上访问(下图是修改好的)不要看行数,看大体位置
如果是虚拟机
安装宝塔页面宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板
修改配置文件同上
开放6379端口
Redis支持五种数据类型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
登录
语法:
redis-cli -h host -p port -a password
实践:
redis-cli -h 127.0.0.1 -p 6379 -a 123456
选择哪个数据库(默认16个)
查看数据库有多少个数据
Redis 字符串(String)
set一个关键字为key1的关键字,其值为value1
127.0.0.1:6379> set key1 value1 OK 127.0.0.1:6379> get key1 "value1" 127.0.0.1:6379> del key1 (integer) 1 127.0.0.1:6379> del key1 (integer) 0 127.0.0.1:6379>
Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。(对于小白来说这是废话)
我认为:
此数据类型和java中的 Map<String, Object> map=new HashMap<String, Object>(); 相似
创建
2种创建方式,一种是hset (一次只操作一组key-value),一种hmset(一次可以操作多组key-value)
HSET 哈希表名称 key1 value1
127.0.0.1:6379> HSET set1 name zhangsan
HMSET 哈希表名称 key1 value1 key2 value2
127.0.0.1:6379> HMSET hset1 name zhangsan age 11 OK
获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> HGETALL hset1 1) "name" 2) "zhangsan" 3) "age" 4) "11" 127.0.0.1:6379>
获取hset1中key为age的value
127.0.0.1:6379> HGET hset1 age "11" 127.0.0.1:6379>
删除键值对
127.0.0.1:6379> HDEL hset1 name (integer) 1 127.0.0.1:6379>
查看hset1中是否有key为name的键值对
127.0.0.1:6379> HEXISTS hset1 name (integer) 0 127.0.0.1:6379>
获取key列表
127.0.0.1:6379> HKEYS hset1 1) "age" 2) "name1" 3) "name2"
Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
我认为: 和java中的 List<String> list=new ArrayList<String>(); 相似
基本操作
LPUSH 在list1中的左边添加zhangsan关键字,返回列表的长度
127.0.0.1:6379> LPUSH list1 zhangsan (integer) 1
RPUSH 在list1中的右边边添加llisi关键字,返回列表的长度
127.0.0.1:6379> RPUSH list1 lisi (integer) 2
LPOP 在左边移除,移除,移除并获取列表的第一个元素,RPOP一样
127.0.0.1:6379> LPOP list1 "111"
查看列表里面所有的数据
127.0.0.1:6379> LRANGE list1 0 -1 1) "zhangsan" 2) "lisi"
Redis 集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
SADD set集合名词 value
127.0.0.1:6379> SADD set1 zhangsan (integer) 1
获取set里面的所有数据
SMEMBERS set集合名称
127.0.0.1:6379> SMEMBERS set1 1) "zhangsan"
查看set集合里面所有的数据
127.0.0.1:6379> SMEMBERS set1 1) "zhangsan"
判断 zhangsan元素是否是集合 set1 的成员
127.0.0.1:6379> SISMEMBER set1 zhangsan (integer) 1 127.0.0.1:6379> SISMEMBER set1 lisi (integer) 0
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
添加数据
127.0.0.1:6379> ZADD sset1 1 zhangsan (integer) 1 127.0.0.1:6379> ZADD sset1 2 lisi (integer) 1 127.0.0.1:6379> ZADD sset1 2 lisi2 (integer) 1 127.0.0.1:6379> ZADD sset1 3 wangwu (integer) 1
显示数据
127.0.0.1:6379> ZRANGE sset1 0 -1 1) "zhangsan" 2) "lisi" 3) "lisi2" 4) "wangwu" 127.0.0.1:6379> ZRANGE sset1 0 -1 WITHSCORES 1) "zhangsan" 2) "1" 3) "lisi" 4) "2" 5) "lisi2" 6) "2" 7) "wangwu" 8) "3" 127.0.0.1:6379>
Redis单机版环境搭建(要联网)
安装步骤
下载安装包
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
解压压缩包
tar -zxvf redis-5.0.8.tar.gz
进入解压的目录
cd redis-5.0.8/
执行make命令.
yum install gcc
yum install gcc-c++
make distclean
make
执行make install 命令
make install
安装完毕后会在 /usr/local/bin/ 目录下如下图所示
在 /usr/local/bin/下启动redis-server ,其中后面的路径为刚开始解压的压缩包中配置文件的位置
./redis-server /opt/module/redis-5.0.8/redis.conf
在 /usr/local/bin/下启动redis-client
./redis-cli
设置服务端为后台启动
修改redis.conf文件
运行远程客户端访问
修改redis.conf文件
Redis主从复制(一台机器开3个redis)
步骤
前提:此文档是在一台机器开3个redis服务,从而完成主从复制
把redis.conf复制3份 ,redis6379.conf redis6380.conf redis6381.conf
修改redis6379.conf 文件
##注意:我redis的版本里的配置文件是下面的行号,其他版本不一定 # bind 127.0.0.1 #大约69行,运行其他IP访问 port 6379 #大约92行 daemonize yes #大约136行 后台启动 pidfile /var/run/redis_6379.pid #大约158行 logfile "6379.log" #大约171行 dbfilename dump6379.rdb #大约253行
修改6380和6381 配置文件,添加主机节点,不仅添加上面的代码,而且还修改自己单独的代码
# replicaof <masterip> <masterport> #大约286行 replicaof 127.0.0.1 6379
启动3台redis服务器(在/usr/local/bin目录下)
./redis-server /opt/module/redis-5.0.8/redis6381.conf
./redis-server /opt/module/redis-5.0.8/redis6380.conf
./redis-server /opt/module/redis-5.0.8/redis6379.conf
启动三台客户端
./redis-cli -p 6379
./redis-cli -p 6380
./redis-cli -p 6381
查看主机结果
哨兵模式
在自定义目录下创建sentinel.conf,其中参数为主机IP和端口
sentinel monitor mymaster 127.0.0.1 6379 1
(在/usr/local/bin目录下)开启哨兵模式
./redis-sentinel /opt/module/redis-5.0.8/sentinel.conf
Redis集群搭建(一台机器开3个redis)
一台机器开3个redis服务器,然后redis端口分别是 6379 7380 6381
安装ruby环境
yum install ruby yum install rubygems
修改redis6389.conf的配置文件
protected-mode no #大约88行 # bind 127.0.0.1 #大约69行,运行其他IP访问 port 6379 #大约92行 daemonize yes #大约136行 后台启动 pidfile /var/run/redis_6379.pid #大约158行 logfile "6379.log" #大约171行 dbfilename dump6379.rdb #大约253行 cluster-enabled yes #大约832行 #打开集群模式 cluster-config-file nodes-6379.conf #大约840行 #设置节点配置文件名 cluster-node-timeout 15000 #大约840行 #设置节点失联时间,超过该时间,集群自动进行主从切换
修改redis6390.conf、redis6391.conf的配置文件
同上,省略,把数字改改
启动3个redis
./redis-server /opt/module/redis-5.0.8/redis6379.conf ./redis-server /opt/module/redis-5.0.8/redis6380.conf ./redis-server /opt/module/redis-5.0.8/redis6381.conf
启动完毕后,正常情况下会生成如下所示文件(在/usr/local/bin目录下)
在解压的redis目录下的src下执行下面命令,不能写localhost,不能写127.0.0.1,其中后面的0是主从复制,一个主节点有几个从节点
redis-cli --cluster create 39.105.30.146:6379 39.105.30.146:6380 39.105.30.146:6381 --cluster-replicas 0
缓存策略
# volatile-lru -> 在过期的key中使用最近最久未使用. # allkeys-lru -> 在所有的key中使用最近最久未使用 # volatile-lfu -> 在过期的key中使用最近最少使用原则. # allkeys-lfu -> 在所有的key中使用最近最少使用原则 # volatile-random -> 在过期的key中随机删除. # allkeys-random -> 在所有的key中随机删除. # volatile-ttl -> 删除快要过期的key # noeviction -> 什么都不做,抛错.