参考资料:http://www.runoob.com/redis/redis-tutorial.html
javaee 互联网轻量级框架整合开发
之前项目需要学了一下mongodb,小结一下就是mongo有许多集合(理解为表),文档(理解为行),适合存储大量数据。基本语法也差不多,确实存储大量数据时很棒。顺便学一下redis,越来越爆款的一款nosql开源数据库,主要开发中当作缓存使用,提高性能,解决并发等问题。有五种数据类型:string(set,get),Hash(HMSET,HGETALL),list(Lpush,Lrange),set(sadd,smembers),sorted set(zset,zrangebycore)
一.redis连接服务:
redis-cli.exe -h 127.0.0.1 -p 6379
连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
or AUTH "password"
二.5种数据类型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
String(字符串):
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
Hash(哈希表):(username , password , points )
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"
List(列表):
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
Set(集合):
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "rabitmq"
2) "mongodb"
3) "redis"
zset(sorted set:有序集合):
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
1) "redis"
2) "mongodb"
3) "rabitmq"
三.reids命令
1.键命令管理键:del,set… 详情参考官方文档:https://redis.io/commands
2.字符串命令:set get…
详情参考官方文档:https://redis.io/commands
3.新增HyperLogLog结构:
redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3
方法:
1 PFADD key element [element ...]
添加指定元素到 HyperLogLog 中。
2 PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。
3 PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
4.redis发布订阅:
客户端1创建订阅频道: redisChat:
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages… (press Ctrl-C to quit)
1) “subscribe”
2) “redisChat”
3) (integer) 1
客户端2发布:
redis 127.0.0.1:6379> PUBLISH redisChat “Redis is a great caching technique”
(integer) 1
5redis事务: MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务
注意redis事务与数据库事务很不一样,放队列时检测命令,命令错误则回滚。命令正确则入队,如操作数据类型错误,则该条命令失效其他数据类型正确操作无误的命令不回滚。可以用watch命令监听某些键。
流水线:希望入队无条件(set get),不依次等待。
cas存在的ABA问题可以用对象+version解决。
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
6管理服务器信息 :info …
7超时命令
设置键超时,超时的键有两种办法:
定时回收:缺点停顿
惰性回收:get时回收
四.redis高级
1数据库备份:save 将在 redis 安装目录中创建dump.rdb文件
可配置快照/只追加文件
主从同步:
写:主服务器写,发同步给从服务器
读:读任何一台从机
主从模式+哨兵
2设置密码:CONFIG set requirepass “root”
验证:AUTH password
3客户端连接:
最大连接数
config get maxclients
1) "maxclients"
2) "10000"
redis-server --maxclients 100000
五.java 连接redis
1.下载jar包
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
jedis.auth("123abc");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
//设置 redis 字符串数据
jedis.set("walle", "fucking handsome man");
System.out.println("redis 存储的字符串为: "+ jedis.get("walle"));
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
}
六.redis与数据库数据一致性问题
不重要的可以考虑读取redis的,重要的要读数据库的
读:尝试读取redis的,有就最好,没就从数据库里取,再放redis
写:直接操作数据库,然后更新到redis
1293

被折叠的 条评论
为什么被折叠?



