一、Redis 的安装
Linux 系统的操作:
1、解压源码;
2、编译(需要预安装gcc:yum install gcc--c++) make;
3、安装 make PREFIX=/usr/local/redis install;
4、从源文件夹复制redis.conf到安装路径redis;
5、运行 ./redis-server;
6、不推荐前端运行,可修改配置中daemonize为后端运行(daemonize no改为 yes)(./redis-server redis.conf);
7、查看是否运行 ps -ef | grep -i redis;
8、关闭服务端 kill -9 进程(不建议使用);./redis-cli shutdown;
9、使用命令:(get) (set) (keys *) (del)
二、 Jedis 的入门
// 单例操作
public void demo1(){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name", "test");
String name = jedis.get("name");
System.err.println(name);
jedis.close();
}
// 连接池操作
public void demo2(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(10);
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379);
Jedis jedis = null;
try{
jedis = jedisPool.getResource();
jedis.set("name", "test");
String value = jedis.get("name");
System.out.println(value);
}catch(Exception e){
e.printStackTrace();
}finally{
if(jedis != null){
jedis.close();
}
if(jedisPool != null){
jedisPool.destroy();
}
}
}
Ps:连接中的问题:linus防火墙对连接的影响以及对于属性修改
1) 打开linux防火墙6379端口:vim etc/sysconfig/iptables(复制yy,粘贴t,复制已开端口22那行)
2) 重启防火墙:service iptables restart
三、Redis 的数据结构
Redis的数据结构之字符串String常用命令:
set company imooc:设置值
get company :取值
getset company :先获取值在设置值
del company 删除值
incr company 对数字加一
decr company 对数字减一 如果没有设置默认为0,如果是字符串,默认报错
incrby company x,增加x
decrby company x,减去x
append 以字符串的形式相加而不是数字形式相加
Redis的数据结构之存储Hash常用命令:
设置值:hset hash key1 val1
设置多个值:hmset hash key1 val1 key2 val2 = hset hash key1 val1 key2 val2
获取单个key值:hget hash key
获取多个key值:hmget hash key1 key2
删除单个key值:hdel hash key1
删除所有:del hash
判断某个属性是否存在:hexists hash key1
获取所有key和value: hgetall hash
获得属性数量:hlen hash
获取所有key: hkeys hash
获取所有val: hvals hash
指定某个属性增加某个数量: hincrby hash age number
Redis的数据结构之存储list常用命令:
两端添加
lpush listname value1 value2 value3:如果listname不存在则创建listname并从左侧添加,先添加的元素靠后,下标从0开始。如果listname存在则直接从左侧添加
rpush listname value1 value2 value3:从右侧添加,先添加的元素靠前,下标从0开始
查看列表
lrange listname start end:左边查看指定范围内的listname的元素,下标从0开始,如果end为-1代表是最后一个元素
两端弹出
lpop listname:左边弹出listname中的第一个元素。如果listname不存在元素则返回nil,一旦做了弹出操作,被弹出的元素将在listname中消失
rpop listname:尾部(右部)弹出,与lpop同理
获取列表元素个数
llen listname:获取listname中元素的个数,如果listname不存在则返回0
扩展命令
lpushx listname value1 value2...:如果listname存在则进行添加操作,如果listname不存在则添加失败返回0
rpushx listname value1 value2...:与lpushx同理
lrem listname count value:如果count大于0,则从左往右删除count个value;如果count小于0,则从右向左删除count个value;如果count等于0则表示删除所有的value
lset listname index value:将listname中下标为index的值修改为value
linsert listname before listvalue value:在listname中的listvalue前插入一个value
linsert listname after listvalue value:在listname中的listvalue之后插入一个value
rpoplpush listname1 listname2:将listname1中右边的第一个元素进行弹出然后向listname2的左侧进行添加弹出的元素
Ps:Set无序。
Redis的数据结构之set常用命令:
像set中增加元素 sadd myset 1 2 3 不允许重复
srem myset 1 2 删除数据
smember Myset 所有的值
sismember myset a 0不存在 1存在
差集运算 sdiff myset1 myset2
交集运算 sinter mya2 myb2
并集运算 sunion mya2 myb2 去掉重复元素
获得set中值的数量 scard myset
随机返回一个成员 srandmember myset
sdiffstore myset1 myset3 myset4 将3 4 的差集存到1里
sinterstore m2 m3 m4 交集存m2
suionstore my3 ma3 mb3 并集存到my3
Redis的数据结构之Sorted-Set常用命令:
添加元素
zadd sortname score1 value1 score2 value2...:向sortname中添加元素value及元素的分数score,如果value存在,但是value对应的score不一样则进行替换
获得元素
zscore sortname value:返回sortname中value对应的score
zcard sortname:返回sortname中的value个数
删除元素
zrem sortname value1 value2:删除sortname中对应value的元素及分数
zremrangebyrank sortname start end:删除下标在start至end范围内的元素value及value对应的score
zremrangebyscore sortname start end:删除score在start至end范围内的元素value及value对应的score
范围查询
zrange sortname start end:返回sortname中下标在start至end范围内的value,返回value的顺序以value的score进行升序排序
zrange sortname start end withscore:返回sortname中下标在start至end范围内的value及value对应的分数,以value对应的score进行升序排序
zrevrange sortname start end withscores:返回sortname中下标在start至end范围内的value及value对应的score,以value的score进行降序排序
扩展命令
zrangebyscore setname start end withscores:返回成绩在start至end之间的value及value对应的成绩
zrangebyscore setname start end withscores limit num1 num2:返回setname中score在start至end之间的num2-num1个的value及value的score
zincyby setname value setkey:对setname的setkey的score加上value
zcount setname start end:返回setname中score在start至end之间的个数
四、Redis的Keys的通用操作
keys *:查询所有key
keys str? :查询以字符串str开头的key
del key1 key2 key3 ... :删除多个key
exists key:判断key是否存在,存在返回1不存在返回0
rename key newkey :对key进行重命名
expire key times(秒) :设置过期的时间
ttl key:查看key所剩的时间,若没有设置,则返回-1
type key :获取指定key的类型
五、Redis 特性
1、多数据库
一个redis实例可以包含多个数据库,最多可以提供16个数据库,下标是从0到15,通过select number 切换数据库
move set number : 把名称为set的集合移动到数据库number中
2、Redis 事务
multi : 开启开务
exec : 提交事务
discard : 回滚事务
六、Redis 持久化
- RDB持久化(默认支持,不需配置):在指定的时间间隔n内,将数据写入到磁盘中。
- AOF持久化机制:以日志的形式记录 服务器中所有redis操作。redis启动后,会读取日志文件,重新构建redis数据库,保证数据的完整。
- 无持久化。
- 同时使用RDB和AOF。
RDB
优势:
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
2.压缩文件转移到其他介质上
3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
,避免服务器进程执行I/O操作,启动效率高
劣势:
1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
配置:
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下
AOF
优势:
1.同步:
a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
b.每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
c.不同步
2.日志写入操作追加模式append
a.系统宕机,不影响存在的内容
b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性
3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
4.格式清晰的日志文件,完成数据的重建
劣势:
1.对于相同数据文件,相比RDB,AOF文件较大
2.效率低
配置:
vim redis.conf
默认:
appendonly no #AOF方式默认关闭
appendfilename appendonly.aof #配置文件
#appendfsync always #每修改一次,同步到磁盘上
appendsync everysec 每秒同步到磁盘一次
#appensync no 不同步
实践打开AOF:
appendonly yes
appendfsync always
终端2:先断开redis
./bin/redis-cli
shutdown
启动redis:
./bin/redis-server ./redis.conf
终端1:set name 100
终端2:产生appendonly.aof文件
终端1:flushall 清空数据库
终端2:
./bin/redis-cli shutdown
vim appendonly.aof
删除flushall
./bin/redis-server ./redis.conf
./bin/redis-cli
keys *
数据还原