2008意大利的一家创业公司开发,网站统计系统。
redis读的速度每秒11万次,写的速度8万1千次。
新浪微博,知乎,github
支持的数据类型:字符串类型,列表类型,有序集合,散列类型,集合类型。
应用场景:数据缓存,任务队列,应用排行榜,网站访问统计,数据过期处理。
分布式集群架构中的session分离
http://www.runoob.com/redis/redis-install.html(参考安装)
linux在线安装redis的依赖环境命令:yum install gcc-c++
在官网上下载tar压缩包
使用filezilla工具上传到root根目录下,
tar -zxvf redis-4.0.1.tar.gz 解压
cd redis-4.0.1
make 编译
make PREFIX=/usr/local/redis install #安装到指定目录中
cd /usr/local
ll 有redis文件夹了
cd redis
cd bin
在安装redis成功后,你将可以在/usr/local/redis看到一个bin的目录,里面包括了以下文件:
1 |
|
cd ~
cd redis-4.0.1
cp redis.conf /usr/local/redis #复制文件到制定文件夹
cd /usr/local/redis #ll看到bin文件夹和redis.conf文件
cd bin
./redis-server(前段启动后当前窗口就不能输入命令了,不推荐)
一般建议后端启动方式:
进入到 /usr/local/redis文件夹下
cd ..
vim redis.conf #编辑文件,表示要启动后端配置启动进程 1041行号修改配置如下:
配置文件中把:不然外部链接不设置密码会连不上
protected-mode yes 中的yes改为no
1.然后就可以后端启动了:
./bin/redis-server ./redis.conf
2.然后通过命令查看redis的进程是否存在
ps -ef | grep -i redis
./bin/redis-cli shutdown #关闭redis命令
设置了密码:先进redis-cli 然后shutdown
ps -ef | grep -i redis查看进程就会发现没有了
再启动:运行客户端存储数据
(/usr/local/redis此时位置)
运行命令: ./bin/redis-cli
输入个:ping
回来pong说明连接正常,exit退出客户端命令
如下图
输入键值对查询key和删除如下
java使用Jedis客户端连接redis
在连接之前要打开linux中6379端口打开,不然jedis在连接的时候会报错
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。
1、关闭并禁止firewall开机启动:
停止
systemctl stop firewalld.service
禁止开机启动
systemctl disable firewalld.service
2、安装iptables防火墙
yum install iptables-services
编辑防火墙配置文件打开指定的端口号使用udp协议打开6379redis端口:
vi /etc/sysconfig/iptables
保存退出
:wq
最后重启防火墙使配置生效
systemctl restart iptables.service
设置防火墙开机启动
systemctl enable iptables.service
如果java客户端是报refuse connect就把redis.conf的文件注释,如下图:
然后在linux客户端设置个密码:
config set requirepass 123
package com.juyuan;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisDemo {
@Test
public void demo01(){
Jedis jedis = new Jedis("192.168.21.129",6379);//设置linux的ip地址和redis的端口号
jedis.auth("123");//设置密码
jedis.set("name", "value");
String value = jedis.get("name");
System.out.println(value);
jedis.close();
}
@Test
public void demo2(){
//获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//设置最大空闲数,控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
config.setMaxIdle(10);
//设置等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
int timesout=1000;
//获得连接池
JedisPool jedisPool = new JedisPool(config,"192.168.21.129",6379, timesout,"123");
Jedis jedis=null;
try{
//通过连接池获得对象
jedis=jedisPool.getResource();
// jedis.auth("123");
jedis.set("name", "张三");
String value=jedis.get("name");
System.out.println(value);
}catch(Exception e ){
e.printStackTrace();
}finally{
if(jedis!=null){
jedis.close();
}
if(jedisPool!=null){
jedisPool.close();
}
}
}
}
@Test
public void demo01(){
Jedis jedis = new Jedis("192.168.21.129",6379);//设置linux的ip地址和redis的端口号
jedis.auth("123");//设置密码
jedis.set("name", "value");
String value = jedis.get("name");
System.out.println(value);
jedis.close();
}
@Test
public void demo2(){
//获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//设置最大空闲数,控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
config.setMaxIdle(10);
//设置等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
int timesout=1000;
//获得连接池
JedisPool jedisPool = new JedisPool(config,"192.168.21.129",6379, timesout,"123");
Jedis jedis=null;
try{
//通过连接池获得对象
jedis=jedisPool.getResource();
// jedis.auth("123");
jedis.set("name", "张三");
String value=jedis.get("name");
System.out.println(value);
}catch(Exception e ){
e.printStackTrace();
}finally{
if(jedis!=null){
jedis.close();
}
if(jedisPool!=null){
jedisPool.close();
}
}
}
}
连接成功!
redis支持的五种数据类型:字符串(String)、hash(哈希)、字符串列表(list)、字符串集合(set)、有序字符串集合(sorted set)
string类型 value的最大长度512M
./redis-cli启动客服端:
设置字符串的值:set company juyuan (company代表key的值,juyuan代表value)
重新设置 key的值:getkey company baidu
get company(get key如果值是nil说明就是空的null)
del key (删除key的value值)
ttl str 得到str保存的时间友多少
expire 100 设置过期时间,-1永久,-2key 不存在
incr num 0
get num 得到的value值递增一
decr num 递减一
increby num 5一次加五从零开始加
appden 5追加5
hash设置:
hset myhash username jack(赋值单个hash的key value)
hget myhash username(取key的username的值为jack)
hmset myhash2 username rose age 12(一次设置多个key-value,key为username和age)
hmget myhash2 username age(获取多个key的value值)
hgetall myhash29(获取所有的key-value对应的值)
hdel myhash2 username age(删除多个key)
)
del myhash2(删除所有的key)
list
lpush mylist abc 左端添加
rpush mylist 123 右端添加
lrange mylist 0 2(查看列表,0代表从第一个元素开始,2代表从倒数第二个元素结束)
lpop mylist 左边弹出第一个元素
llen mylist 查询list的size
一个redis实例里面有16个数据库(0~15)
默认是0号数据库
select 1就切换到1号数据库里了
discard回滚
exec提交
multi事物开启
redis的持久化:
redis持久化的两种方式:rdb方式(制定时间内写入磁盘)如果断电的话会丢数据
aof的方式指的是把写操作指令,持续的写到一个类似日志文件里,相对rdb的方式数据的完整性要高点!
两种区别就是,一个是持续的用日志记录写操作,crash后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。
AOF的策略:
启用aof,把appendonly 后面的no改为yes。
appendfsync always 每修改一次都保存到硬盘当中(一般选择第一种方式,安全及时保存数据)注释掉第二种
appendsync everysec 每秒都保存数据
appendfsync no 不同步
修改完成重启生效