学习redis的标准,要能在新环境中设计搭建redis缓存系统
2.memcached
3.MongoDB
1.redis
redis是内存数据库,有别于关系型数据库,redis是key-value键值对形式的数据库。操作redis命令就相对sql。相比于memcached,Redis是单线程运行。redis是c语言写的(什么时候能有个中国人,写个全世界级的开源软件)。
redis存的数据类型有5种:字符串、哈希、链表、集合、有序集合
操作数据命令
字符串(string):
set,get
哈希(hash):
hset,hget
链表(List):
lpush,lpop
集合(sets):
sadd,sremove
有序集合(sorted sets):
zadd,zrem
1.1 下载安装redis
下载
https://github.com/ServiceStack/redis-windows/blob/master/downloads/redis64-3.0.501.zip
解压后配置
redis.windows.conf文件
#配置redis内存大小 #maxmemory <bytes> maxmemory 1024000000 #配置密码 # requirepass foobared requirepass 111111
#启动redis服务器
D:\service\redis64-3.0.501>redis-server.exe redis.windows.conf
1.2 redis使用-客户端
#启动redis客户端
D:\service\redis64-3.0.501>redis-cli.exe -p 6379 127.0.0.1:6379> set name byron (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 111111 OK 127.0.0.1:6379> set name byron OK 127.0.0.1:6379> get name "byron" 127.0.0.1:6379>
#安装windows服务
D:\service\redis64-3.0.501>redis-server --service-install redis.windows.conf --l oglevel verbose [3288] 09 Jun 22:48:00.926 # Granting read/write access to 'NT AUTHORITY\Network Service' on: "D:\service\redis64-3.0.501" "D:\service\redis64-3.0.501\" [3288] 09 Jun 22:48:00.927 # Redis successfully installed as a service. D:\service\redis64-3.0.501>
下次重启电脑后,可直接执行客户端命令
redis-cli.exe
常用命令:
#查看服务器信息
>info
#查看服务器连接情况(返回pong说明连接正常)
>ping
#清空数据库
>flushdb
#keys值数量
>dbsize
#基本数据操作
>set name test
>get name
>del name
>exists name
>type name
>keys * // 查询满足特定格式的key
>rename name name1 //重名了key值
1.3 redis master-slave设计
将redis安装文件复制成多份(根据要设计的redisslave个数决定),修改配置文件redis.windows.conf
#slave1
port 6380
bind 127.0.0.1
requirepass 111180
slaveof 127.0.0.1 6379
masterauth 111111
slave-read-only yes
#slave2
port 6381
bind 127.0.0.1
requirepass 111181
slaveof 127.0.0.1 6379
masterauth 111111
slave-read-only yes
设置完后启动redis,可通过
>redis-cli.exe -p 6380
访问slave的redis
redis分布式集群需要ruby环境
redis分布式集群-java,设置新建2个独立的master实例,jedis中实现分布式
1.4 redis使用-java
redisjar包:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
java调用redis服务,主要有自连,事务,管道,分布式或者其中2者的组合。用户可根据不同场景使用不同方法
package com.byron.redis.client; import java.util.Arrays; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.Pipeline; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPipeline; import redis.clients.jedis.ShardedJedisPool; import redis.clients.jedis.Transaction; public class RedisClient { /** * 普通调用 */ public void test1Normal() { Jedis jedis = new Jedis("localhost"); jedis.auth("111111"); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = jedis.set("n" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); } /** * 事务调用 */ public void test2Trans() { Jedis jedis = new Jedis("localhost"); jedis.auth("111111"); long start = System.currentTimeMillis(); Transaction tx = jedis.multi(); for (int i = 0; i < 100000; i++) { tx.set("t" + i, "t" + i); } List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); } /** * 管道调用 */ public void test3Pipelined() { Jedis jedis = new Jedis("localhost"); jedis.auth("111111"); Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("p" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); } /** * 管道事务调用 */ public void test4combPipelineTrans() { Jedis jedis = new Jedis("localhost"); jedis.auth("111111"); long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); pipeline.multi(); for (int i = 0; i < 100000; i++) { pipeline.set("" + i, "" + i); } pipeline.exec(); List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined transaction: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); } /** * 分布式调用 */ public void test5shardNormal() { JedisShardInfo shard1 = new JedisShardInfo("localhost",6379); shard1.setPassword("111111"); JedisShardInfo shard2 = new JedisShardInfo("localhost",6378); shard2.setPassword("111178"); List<JedisShardInfo> shards = Arrays.asList(shard1, shard2); ShardedJedis sharding = new ShardedJedis(shards); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = sharding.set("sn" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds"); sharding.disconnect(); } /** * 分布式管道调用 */ public void test6shardpipelined() { JedisShardInfo shard1 = new JedisShardInfo("localhost",6379); shard1.setPassword("111111"); JedisShardInfo shard2 = new JedisShardInfo("localhost",6378); shard2.setPassword("111178"); List<JedisShardInfo> shards = Arrays.asList(shard1, shard2); ShardedJedis sharding = new ShardedJedis(shards); ShardedJedisPipeline pipeline = sharding.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("sp" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds"); sharding.disconnect(); } public void test7shardSimplePool() { JedisShardInfo shard1 = new JedisShardInfo("localhost",6379); shard1.setPassword("111111"); JedisShardInfo shard2 = new JedisShardInfo("localhost",6378); shard2.setPassword("111178"); List<JedisShardInfo> shards = Arrays.asList(shard1, shard2); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); ShardedJedis one = pool.getResource(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = one.set("spn" + i, "n" + i); } long end = System.currentTimeMillis(); pool.returnResource(one); System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds"); pool.destroy(); } /** * 分布式连接池异步调用 */ public void test8shardPipelinedPool() { JedisShardInfo shard1 = new JedisShardInfo("localhost",6379); shard1.setPassword("111111"); JedisShardInfo shard2 = new JedisShardInfo("localhost",6378); shard2.setPassword("111178"); List<JedisShardInfo> shards = Arrays.asList(shard1, shard2); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); ShardedJedis one = pool.getResource(); ShardedJedisPipeline pipeline = one.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("sppn" + i, "n" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); pool.returnResource(one); System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds"); pool.destroy(); } public static void main(String[] args) { RedisClient client = new RedisClient(); // client.test1Normal(); // Simple SET: 9.562 seconds // client.test2Trans(); // Transaction SET: 0.757 seconds // client.test3Pipelined(); // Pipelined SET: 0.687 seconds // client.test4combPipelineTrans(); // Pipelined transaction: 0.787 seconds // client.test5shardNormal(); // Simple@Sharing SET: 10.988 seconds // client.test6shardpipelined(); // Pipelined@Sharing SET: 0.964 seconds // client.test7shardSimplePool(); // Simple@Pool SET: 11.567 seconds // client.test8shardPipelinedPool(); // Pipelined@Pool SET: 0.985 seconds } }
由上面测试可知,第一种自连与第二种事务,很明显事务快很多,那是不是多用事务。其实不然,如果只是插入一条数据,自连就明显比事务快。
1.5 redis使用-spring
1.6 redis使用-企业级设计
参考网站:
https://redis.io/
win7x64下的redis安装与使用
http://www.cnblogs.com/koal/p/5484916.html
redis常用命令
http://blog.csdn.net/tangsilai/article/details/7477961
Redis使用详细教程
http://www.cnblogs.com/wangyuyu/p/3786236.html