一、学习网站
- Redis官网 http://redis.io/
- Redis中文网 http://www.redis.net.cn/
- Redis教程 http://www.redis.net.cn/tutorial/3501.html
http://www.runoob.com/redis/redis-tutorial.html
二、安装
$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.2.1.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-3.2.1.el_capitan.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don't want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
/usr/local/Cellar/redis/3.2.1: 10 files, 1.7M
执行完命令以后Redis安装在/usr/local/Cellar/redis/3.2.1目录下.
打开terminal,启动redis服务:
redis-server
启动redis服务之后就可以启动redis客户端,执行命令:
redis-cli
redis默认端口是6379.
配置文件在安装目录下的:redis.conf
后台启动:
修改redis.conf,找到daemonize并设置取值为yes,启动时加载配置文件:
./bin/redis-server redis.conf
三、Redis数据类型
Redis支持5种数据类型:String(字符串)、hash(哈希)、列表(list)、集合(set)以及set(有序集合).
3.1 String字符串
String是Redis最基本的类型,一个key对应一个value.
127.0.0.1:6379> SET name "w3cschool.cc"
OK
127.0.0.1:6379> get name
"w3cschool.cc"
上面的例子中使用了Redis的SET和GET命令.key为name,值为”w3cschool.cc”
3.2 Hash
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
127.0.0.1:6379> HMSET user:1 username w3cschool.cc password w3cschool.cc points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "w3cschool.cc"
3) "password"
4) "w3cschool.cc"
5) "points"
6) "200"
以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。
每个 hash 可以存储
2^32 - 1 键值对(40多亿)。
3.3 List(列表)
列表是简单的字符串列表,按照插入顺序,可以添加一个元素到列表到头部或尾部.
List中的key是可重复的.
127.0.0.1:6379> lpush course English
(integer) 1
127.0.0.1:6379> lpush course Math
(integer) 2
127.0.0.1:6379> lpush course Music
(integer) 3
127.0.0.1:6379> lrange course 0 100
1) "Music"
2) "Math"
3) "English"
127.0.0.1:6379> lpop course
"Music"
127.0.0.1:6379> lrange course 0 100
1) "Math"
2) "English"
列表最多可存储 232 -1 元素 (4294967295, 每个列表可存储40多亿)。
3.4 Set(集合)
Set集合是String类型的无序列表.内部使用hash,添加、删除、查找的时间复杂度都是O(1)。
集合中的元素具有唯一性,初次添加成功返回1,添加的元素已存在返回0.
127.0.0.1:6379> sadd users zhangsan
(integer) 1
127.0.0.1:6379> sadd users lisi
(integer) 1
127.0.0.1:6379> sadd users wangwu
(integer) 1
127.0.0.1:6379> sadd users zhangsan
(integer) 0
127.0.0.1:6379> smembers users
1) "wangwu"
2) "lisi"
3) "zhangsan"
3.5 zset(有序集合)
Redis 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
127.0.0.1:6379> zadd grade 100 xiaoming
(integer) 1
127.0.0.1:6379> zadd grade 80 xiaohua
(integer) 1
127.0.0.1:6379> zadd grade 95 xiaohong
(integer) 1
127.0.0.1:6379> zadd grade 88 xiaohei
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE grade 0 100
1) "xiaohua"
2) "xiaohei"
3) "xiaohong"
4) "xiaoming"
127.0.0.1:6379>
四、Redis Java API
4.1.参考资料
http://www.runoob.com/redis/redis-java.html
4.2.下载jar包
http://repo1.maven.org/maven2/redis/clients/jedis/2.9.0/
4.3.导入jar包
新建java工程,导入jedis-version.jar
4.4 测试连接
先启动redis-server.
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.ping());
console中打印PONG说明成功连接到服务器.
4.5 String操作
//设置 redis 字符串数据
jedis.set("w3ckey", "Redis tutorial");
// 获取存储的数据并输出
System.out.println("w3ckey: " + jedis.get("w3ckey"));
//获取一个不存在的key会打印null
System.out.println("w3ckey2: " + jedis.get("w3ckey2"));
//拼接字符串
jedis.append("w3ckey", " Second Edition");
// 输出appedn之后的value
System.out.println("append之后的w3ckey: " + jedis.get("w3ckey"));
//一次设置多个键值对
jedis.mset("name", "张三", "age", "24", "QQ", "175400XX");
System.out.println("name:" + jedis.get("name"));
System.out.println("age:" + jedis.get("age"));
System.out.println("QQ:" + jedis.get("QQ"));
//对age执行加1操作 只能对value为整型的key进行incr()操作.
jedis.incr("age");
System.out.println("age:" + jedis.get("age"));
4.6.List操作
System.out.println("**********List操作**********");
//存储数据到列表
jedis.lpush("course-list", "Math");
jedis.lpush("course-list", "English");
jedis.lpush("course-list", "Music");
jedis.lpush("course-list", "Math");
//读取List数据
List<String> list = jedis.lrange("course-list", 0, 10);
for (String str : list) {
System.out.println(str);
}
4.7.Set操作
System.out.println("**********Set操作**********");
jedis.sadd("color", "White");
jedis.sadd("color", "Blue");
jedis.sadd("color", "Red");
jedis.sadd("color", "Blue");
jedis.sadd("color","Black","Yellow","Purple");
//移除一个元素
jedis.srem("color","Yellow");
System.out.println(jedis.smembers("color"));
//set中的元素不重复 循环遍历
Set<String> color = jedis.smembers("color");
Iterator<String> iter = color.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
//判断集合中是否存在某个元素
System.out.println(jedis.sismember("color", "Red"));
//返回集合中的元素个数
System.out.println(jedis.scard("color"));
//返回集合中的一个随机数
System.out.println(jedis.srandmember("color"));
//返回集合中多个随机数
System.out.println(jedis.srandmember("color",2));
4.8 map操作
//存入一个map
Map<String,String> map=new HashMap<String,String>();
map.put("title","Redis In Action");
map.put("author","Jos");
map.put("price","45$");
jedis.hmset("book",map);
//读取book的一个字段 返回的是一个list
System.out.println(jedis.hmget("book","title"));
//读取book的一个多个字段
System.out.println(jedis.hmget("book","title","author","price"));
//删除map中的某个key
jedis.hdel("book","price");
//新增一个key
jedis.hset("book","description","Useful Book!");
//判断是否存在一个map
System.out.println("if exists map book:"+jedis.exists("book"));
//打印一个map
System.out.println("get all:"+jedis.hgetAll("book"));
//打印map中所有的key
System.out.println("get all keys:"+jedis.hkeys("book"));
//打印map中所有的value
System.out.println("get all values:"+jedis.hvals("book"));
//map中key的个数
System.out.println(jedis.hlen("book"));
//遍历一个map
Iterator<String> iter2=jedis.hkeys("book").iterator();
while(iter2.hasNext()){
String key=iter2.next();
System.out.println(key+":"+jedis.hmget("book",key));
}
4.9.zset操作
System.out.println("***zset操作***");
jedis.zadd("grade",100,"StudentA");
jedis.zadd("grade",70,"StudentB");
jedis.zadd("grade",85,"StudentC");
jedis.zadd("grade",95,"StudentD");
System.out.println(jedis.zrange("grade",70,100));
System.out.println(jedis.zrangeByScore("grade",0,100));
4.10.Keys操作
//删除一个key
jedis.del("course-list");
jedis.del("");
System.out.println("**********All Keys**********");
Set<String> listKeys = jedis.keys("*");
for (String str : listKeys) {
System.out.println(str);
//jedis.del(str);
}
五、Redis占用内存大小
启动redis-server,redis-cli
查看redis占用了多少内存,使用info命令来查看.
输入命令
127.0.0.1:6379> info memory
返回信息:
# Memory
used_memory:1008784 //数据占用了多少内存(字节
used_memory_human:985.14K //数据占用了多少内存(带单位的,可读性好)
used_memory_rss:2117632 //redis占用了多少内存
used_memory_rss_human:2.02M //redis占用了多少内存 (带单位的,可读性好)
used_memory_peak:1009568 //占用内存的峰值(字节)
used_memory_peak_human:985.91K //占用内存的峰值(带单位的,可读性好)
total_system_memory:8589934592 //系统总内存大小(字节)
total_system_memory_human:8.00G //系统总内存大小(带单位)
used_memory_lua:37888 //lua引擎所占用的内存大小(字节)
used_memory_lua_human:37.00K //lua引擎所占用的内存大小(带单位)
maxmemory:0 //允许Redis使用的最大内存(字节)
maxmemory_human:0B //允许Redis使用的最大内存(带单位)
maxmemory_policy:no eviction //超过最大内存后的内存回收策略
mem_fragmentation_ratio:2.10 //内存碎片率
mem_allocator:libc //redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。
设置maxmemory之后,redis的内存使用不得超过设定的值,如果redis的内存使用量超过了最大值,redis会尝试使用回收策略回收相应的keys.
如果不能根据回收策略移除keys,或者回收策略设置成no eviction,那么redis没有内存可用,对于需要写操作的命令返回错误信息,对于只读操作会继续响应.
测试100万个key-value占用的内存大小:
写入之前,Redis占用的内存大小:26.23M
写入100万个key-value:
for (int i = 0; i < 1000000; i++) {
jedis.set("key " + i, "redis performance " + i);
}
写入之后,Redis占用的内存大小:100.53M
数据占内存的大小与key和key value的长度正相关。
六、Redis相关命令
6.1 键值相关命令
6.1.1 数据库选择
redis数据库0-15一共16个
默认使用第0个
使用第一个:
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
服务器、端口后面会有数据库名称.
6.1.2.过期时间设置
默认的key不设置过期时间是持久存储的。设置过期时间命令:
expire keyname livetime
比如:expire name 50
,这条命令设置key为name的存活时间长度为50秒.
通过ttl命令可以获取key的有效时长:
ttl keyname
如果一个key已经设置了过期时间,想要持久化,可以移除过期时间:
127.0.0.1:6379> expire bloghash 300
(integer) 1
127.0.0.1:6379> ttl bloghash
(integer) 295
127.0.0.1:6379> ttl bloghash
(integer) 294
127.0.0.1:6379> persist bloghash
(integer) 1
127.0.0.1:6379> ttl bloghash
(integer) -1
ttl keyname返回值为-1说明是持久化的key.
6.13.随机返回一个key
127.0.0.1:6379> randomkey
"mylist"
127.0.0.1:6379> randomkey
"set4"
127.0.0.1:6379> randomkey
"bloghash"
6.1.4.查看返回值类型
127.0.0.1:6379> type mylist
list
127.0.0.1:6379> type myset
set
127.0.0.1:6379> type myhash
hash
127.0.0.1:6379> type name
string
6.2 服务器相关命令
测试链接是否存活
127.0.0.1:6379> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> ping
PONG
打印内容
127.0.0.1:6379> echo helloworld
"helloworld"
退出
quit
返回当前数据库中key的数目
127.0.0.1:6379> dbsize
(integer) 11
获取服务器信息和统计
127.0.0.1:6379> info
info会返回所有的信息
127.0.0.1:6379> info server
# Server
# Clients
# Memory
# Persistence
# Stats
# Replication
# CPU
# Cluster
# Keyspace
删除当前数据库中所有的key
flushdb
删除所有数据库中所有的key
flushall