声明:本文参考网上资料整理而成,只为梳理记录。如有错误望不吝赐教。在此拜谢!持续完善修改中…
随时参考
定义
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 —[摘自百度百科]
应用场景
- 取最新N个数据的操作
- 排行榜应用,取TOP N操作
- 需要精准设定过期时间的应用
- 计数器应用
- Uniq操作,获取某段时间所有数据排重值
- 实时系统,反垃圾系统
- Pub/Sub构建实时消息系统
- 构建队列系统
- 缓存
参考链接
服务搭建
下载服务并启动
Redis下载地址:http://redis.io/download
linux环境
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
$ make test
$ redis-server ../redis.conf //注意 redis.conf 的路径
以上:redis.conf 为 Redis 的自定义配置文件
客户端链接
启动客户端
$ redis-cli
客户端链接远程 Redis 服务
$ redis-cli -h host -p port -a password
检查 Redis 服务是否正常
redis> ping
PONG
将 [key]= name 和 [value] = Mikayla 放入 redis 库中
redis> set name Mikayla
OK
redis> get name
"jiu"
make 过程常见的错误
异常1
make[2]: cc: Command not found
异常原因:没有安装 gcc
解决方案:yum install gcc-c++
异常2
zmalloc.h:51:31: error: jemalloc/jemalloc.h: No such file or directory
异常原因:一些编译依赖或原来编译遗留出现的问题
解决方案:make distclean。清理一下,然后再make
在make成功以后,需要make test。在make test出现异常
- 异常3
couldn't execute "tclsh8.5": no such file or directory
异常原因:没有安装 tcl
解决方案:yum install -y tcl
Redis 数据类型
表格展示
数据类型 | 说明 | 存储大小 | 命令格式 | 放值 | 取值 |
---|---|---|---|---|---|
string | 字符串 | 一个键最大能存储512MB | SET | GET | |
hash | 哈希 | 2的32次方 -1 键值对(40多亿) | HMSET | HGETALL | |
list | 列表 | 2的32次方-1元素(4294967295,每个列表可存储40多亿) | lpush | lrange | |
set | 集合 | 2的32次方-1(4294967295,每个集合可存储40多亿个成员) | sadd key member | sadd | smembers |
zset | 有序集合 | zadd key score member | zadd | ZRANGEBYSCORE |
针对以上数据类型,做以下简单练习:
[备注 * 每种类型可以和对应的 Redis 命令的实现做对比]
public class TestRedis {
public static void main(String[] args) {
Jedis jedis = new Jedis("Redis 服务 IP 地址");
System.out.println("链接成功");
System.out.println("服务正在运行:" + jedis.ping());
//string 字符串
jedis.set("redis_string", "mikayla_redis_string");
System.out.println("redis 存储key:【redis_string】的字符串为:" + jedis.get("redis_string"));
//map 哈希
Map userMap = new HashMap();
userMap.put("username", "runoob");
userMap.put("points", "200");
userMap.put("password", "runoob");
jedis.hmset("redis_map:1", userMap);
System.out.println("redis 存储key:【redis_map:1】的字符串为:" + JsonUtil.toJson(jedis.hgetAll("redis_map:1")));
//list 列表
jedis.lpush("redis_site-list", "Runoob");
jedis.lpush("redis_site-list", "Google");
jedis.lpush("redis_site-list", "Taobao");
List<String> list = jedis.lrange("redis_site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
//set 集合
jedis.sadd("redis_set", "set2", "set5", "set3");
System.out.println("redis_set>>> "+ JsonUtil.toJson(jedis.smembers("redis_set")));
//zset 有序集合 TODO:实现失败,待补充
/*jedis.zadd("redis_zset", 0, "redis");
jedis.zadd("redis_zset", 0, "mongodb");
jedis.zadd("redis_zset", 0, "rabitmq");
System.out.println("redis_zset>>> " + JsonUtil.toJson(jedis.zrangeByLex("redis_zset", 0, 5)));*/
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
}
Redis 常用命令
查看库中所有的 key
redis> keys *
清空 Redis 数据
1、使用redis客户端链接远程redis服务
2、使用命令
redis> flushdb
删除当前库中的所有key
redis> flushall
删除所有数据库中的key
String 类型的存放
redis> set name Mikayla
OK
redis> get name
"Mikayla"
Hash 类型的存放
redis> hmset user:1 username Mikayla password 123
OK
redis> hgetall user:1
1)"username"
2)"Mikayla"
3)"password"
4)"123"
redis>
List 类型的存放
redis> lpush listname redis
(integer) 1
redis> lpush listname mongodb
(integer) 2
redis> lpush listname mysql
(integer) 3
redis> lrange listname 0 10
1)"redis"
2)"mongodb"
3)"mysql"
redis>
Set 类型的存放
无序集合,元素不重复
redis> sadd setname redis
(integer) 1
redis> sadd setname mongodb
(integer) 1
redis> sadd setname mysql
(integer) 1
redis> sadd setname redis
(integer) 0
redis> smembers setname
1)"mysql"
2)"mongodb"
3)"redis"
redis>
Zset 类型的存放
有序集合,元素不重复
redis> sadd zsetname 0 redis
(integer) 1
redis> sadd zsetname 0 mongodb
(integer) 1
redis> sadd zsetname 0 mysql
(integer) 1
redis> sadd zsetname 0 redis
(integer) 0
redis> smembers setname
1)"redis"
2)"mongodb"
3)"mysql"
redis>