1. Redis应用场景
- 缓存
- 任务队列
- 应用排行榜
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
2. Jedis入门
Jedis是Redis官方首选的java客户端开发包。https://github.com/xetorthio/jedis
Jedis jedis = new Jedis("localhost");
jedis.set("foo", "bar");
String value = jedis.get("foo");
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set("foo", "bar");
String value = jc.get("foo");
set name mark
get name
del name
incr num # 默认从0开始
decr num
incrby num 2 # num += 2
decrby num 3 # num -= 3
append num 5 # 玩后追加,如果num没有,则相当于set num 5
Redis数据结构
Hash
## set
hset myhash username jack
hset myhash age 18
hmset myhash2 username rose age 21
## get
hmget myhash usename age
hgetall myhash
## delete
hdel myhash2 username
hdel myhash2 username age
del myhash2
## increase
hincreby myhash age 5
## verify if exists
hexits myhash username
## get length
hlen myhash
## get all values
hvals myhash
List
- ArrayList使用数组方式
- LinkedList使用(使用双向链表方式)
## push
lpush mylist a b c # push from left
rpush mylist c b a # push from right
## get
lrange mylist 0 5
lrange mylist 0 -1
## pop
lpop mylist
rpop mylist
## length
llen mylist
lpushx mylist x
rpushx mylist y
## delete
lrem mylist 2 3 # delete 2 个 3
lrem mylist 0 -1 #
lset mylist 3 value # mylist[3]=value
linsert mylist before b 11 #在第一个值为b的位置前插入11
lpoplpush mylist1 mylist2 #将mylist1中的值pop然后加入到mylist2
Set
set集合不允许出现重复值,如果重复添加只保留一份拷贝。
sadd myset a b c
sadd myset a
srem myset a
smembers myset
sismember myset a # 1: exist; 0: no exist
sunion myset1 myset2 # 并集运算
scard myset # len of myset
srandmember myset # 随机返回myset的value
sdiffstore myset1 myset2 myset3 # 求差集并存到myset1
sinterstore myset1 myset2 myset3 # 求交集并存到myset1
sorted-set
Keys通用操作
keys * # select all keys
keys my?
del mylist1
exists mylist1
rename mylist1 newmylist1
expire newmylist1 1000 #set expore time: 1000s
ttl newmylist1 # 剩余有效时间
type mylist # query type
Redis的特性
多数据库
可以有多个实例。最多可提供16个。默认连接第0号数据库。
select 0
move myset 1#将1号数据库中的myset移动到1号数据库
事物
保证命令原子化执行。
multi # 开启事物
exec # 提交事物
discard # 回滚事物
Redis持久化
Redis将内存中的数据同步到硬盘中称为持久化。
持久化使用的方式:
- RDB持久化(在指定的时间内将内存中的数据中快照到磁盘中)
- AOF持久化(以日志形式存储操作)
- 同时使用RDB和AOF持久化
- 无持久化
RDB持久化
可以设置每个小时归档一次,每天归档一次。
优点:避免了频繁的进程IO切换
缺点:如果服务器宕机一段时间了,那么某段时间的数据就会丢失。
redis.conf 默认配置文件
save 900 1 # 每900s至少有1个key发生变化,做一次持久化操作
save 300 10 # 每300s至少有10个key发生变化,做一次持久化操作
save 60 10000 # 每60s至少有10000个key发生变化,做一次持久化操作
dbfilename dupm.rdb # 导出的文件名
dir ./ # 存储至redis当前路径下
AOF持久化
优势:
日志采用append方式,就算宕机了,不会影响之前的日志文件。
如果日志过大,可以新增日志文件。这样可以更好的保证数据的安全性。
劣势:
每修改就同步,效率相对较低
配置:
redis.conf
appendanly no # 默认不启用AOF,no改为yes则启用
## 三种AOF策略
appendfsyn always # 每修改一次写入硬盘
appendfsync everysec # 每秒同步
appendfsync no # 不同步
Redis的启动和关闭
./bin/redis-cli shutdonw # 断开连接
./bin/redis-server ./redis.conf # 启动redis
./bin/redis-cli # 连接redis客户端