Redis总结

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一、学习网站Redis官网 http://redis.io/ Redis中文网 http://www.

一、学习网站

二、安装

$ 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

七、Redis宣言

Redis宣言里面阐述了Redis的七大特性,值得学习,原文翻译

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
缓存 监控 NoSQL
Redis高可用总结:Redis主从复制、哨兵集群、脑裂...
在实际的项目中,服务高可用非常重要,如,当Redis作为缓存服务使用时, 缓解数据库的压力,提高数据的访问速度,提高网站的性能 ,但如果使用Redis 是单机模式运行 ,只要一个服务器宕机就不可以提供服务,这样会可能造成服务效率低下,甚至出现其相对应的服务应用不可用。
514 0
Redis高可用总结:Redis主从复制、哨兵集群、脑裂...
|
NoSQL Redis
Redis学习7:按次结算的服务控制、微信会话顺序管理(应用场景总结)
现在数据类型五种基本的已经学完了,现在开始应用一个简单的业务场景。
Redis学习7:按次结算的服务控制、微信会话顺序管理(应用场景总结)
|
存储 SQL NoSQL
新人入坑Redis必会的吐血总结(一)
新人入坑Redis必会的吐血总结
175 0
新人入坑Redis必会的吐血总结(一)
|
缓存 监控 NoSQL
Redis常见面试题总结
Redis常见面试题总结
107 0
Redis常见面试题总结
|
数据采集 分布式计算 NoSQL
爬虫识别-爬虫写入 Redis-效果及总结| 学习笔记
快速学习爬虫识别-爬虫写入 Redis-效果及总结
爬虫识别-爬虫写入 Redis-效果及总结| 学习笔记
|
存储 缓存 NoSQL
浅浅总结Redis
Redis作为开源数据库,为开发者提供了多种语言的API。而Redis应用在实际开发中已经很常见了,不仅能作为缓存存储数据,也由于其键值对存储数据的形式而可以作为持久化数据存储。接下来我们浅谈一下Redis的集群和缓存。
127 0
浅浅总结Redis
|
存储 NoSQL 安全
新人入坑Redis必会的吐血总结(二)
新人入坑Redis必会的吐血总结(二)
134 0
|
存储 缓存 负载均衡
Redis cluster去中心化设计的思考与总结
Redis cluster去中心化设计的思考与总结
277 0
|
存储 缓存 监控
redis总结万能手册,熟悉不等于精通;
日常总结:redis线程模型,多路复用原理;单体,哨兵架构,集群架构的自动化安装,解释说明,集群扩容,缩容,选举,主从自动切换策略,应用程序接入……
285 0
redis总结万能手册,熟悉不等于精通;
|
NoSQL Redis
熬夜爆肝总结Liunx环境源码安装Redis
熬夜爆肝总结Liunx环境源码安装Redis
146 0
熬夜爆肝总结Liunx环境源码安装Redis