Redis是目前业界使用最广泛的内存数据存储。
Redis支持丰富的数据结构,同时支持数据持久化。
Redis还提供一些类数据库的特性,比如事务,HA,主从库。
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以再次加载使用
Redis不仅仅支持简单的key-value类型的数据,同时还支持list,set,zset,hash等数据结构的存储
Redis支持数据的备份
支持主从同步,数据存在内存中,性能卓越。
Redis数据结构
String(字符串)
String是redis最基本的类型,一个key对应一个value
1234
127.0.0.1:6379> set name "runoob"OK127.0.0.1:6379> get name"runoob"
set 和 get 命令,key为name,value为runoob。
List(列表)
双向列表,适用于最新列表,关注列表
列表是最简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部或者尾部
12345678910
127.0.0.1:6379> lpush runoob redis(integer) 1127.0.0.1:6379> lpush runoob mongodb(integer) 2127.0.0.1:6379> lpush runoob damin(integer) 3127.0.0.1:6379> lrange runoob 0 101) "damin"2) "mongodb"3) "redis"
lpush存入链表,lrange列出链表
Set(集合)
适用于无顺序的集合,点赞点踩,抽奖,已读,共同好友
Redis的Set是String类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找,都是$O(1)$
$asdd$命令:添加一个string元素命令到key对应的set集合中,成功返回1,如果元素已经存在,返回0,key对应的set不存在返回错误。
123456789101112
127.0.0.1:6379> SADD damin redis(integer) 1127.0.0.1:6379> SADD damin mysql(integer) 1127.0.0.1:6379> SADD damin mongodb(integer) 1127.0.0.1:6379> SADD damin mysql(integer) 0127.0.0.1:6379> SMEMBERS damin1) "mongodb"2) "mysql"3) "redis"
SortedSet(有序集合)
排行榜,优先队列
和set一样,zadd也是不允许重复的成员
Hash(哈希)
对象属性,不定长属性数
是一个键名对集合
hash特别适合用于存储对象
123456789
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200OK127.0.0.1:6379> HGETALL user:11) "username"2) "runoob"3) "password"4) "runoob"5) "points"6) "200"
Redis HMSET , HGETALL 命令,user:1为键值
KV:单一数值,验证码,PV,缓存
启动Redis
12
1、用cmd命令转到redis根目录下2、执行cmd命令:redis-server redis.windows.conf
Redis基础
基本指令功能
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
* Created by nowcoder on 2016/7/30. */public class implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(JedisAdapter.class); private JedisPool pool; public static void print(int index, Object obj) { System.out.println(String.format("%d, %s", index, obj.toString())); } public static void main(String[] argv) { Jedis jedis = new Jedis("redis://localhost:6379/9"); jedis.flushDB(); // get set jedis.set("hello", "world"); print(1, jedis.get("hello")); //输出hello对应的world jedis.rename("hello", "newhello"); //newhello替代hello print(1, jedis.get("newhello")); //指向输出world jedis.setex("hello2", 1800, "world"); print(1,jedis.get("hello2")); jedis.set("pv","100"); //点踩功能 jedis.incr("pv"); //加1 jedis.incrBy("pv",5); //加5 print(2,jedis.get("pv")); jedis.decrBy("pv",2); //减2 print(2,jedis.get("pv")); print(3,jedis.keys("*")); //输出所有表 String listName ="list"; jedis.del(listName); for(int i=0;i<10;i++){ jedis.lpush(listName,"a"+String.valueOf(i)); //添加进表 } print(4,jedis.lrange(listName,0,12)); //输出范围0-12的内容 print(4,jedis.lrange(listName,0,2)); //输出范围0-2的内容 print(5,jedis.llen(listName)); //输出长度 print(6,jedis.lpop(listName)); //弹出最前一个的内容 print(10,jedis.linsert(listName,BinaryClient.LIST_POSITION.AFTER,"a4","dd")); print(11,jedis.lrange(listName,0,11)); String userKey = "userxx"; jedis.hset(userKey,"name","jim"); jedis.hset(userKey,"age","12"); jedis.hset(userKey,"phone","1562225555"); print(12,jedis.hget(userKey,"name")); //取出对应信息 print(13,jedis.hgetAll(userKey)); //全部取出 jedis.hdel(userKey,"phone"); print(14,jedis.hgetAll(userKey)); //取出全部信息 print(15,jedis.hexists(userKey,"email")); //有没有email print(16,jedis.hexists(userKey,"age")); //有没有age print(17,jedis.hkeys(userKey)); //输出key print(18,jedis.hvals(userKey));// 输出值 jedis.hsetnx(userKey,"school","zju"); //添加学校属性 jedis.hsetnx(userKey,"name","yxy"); //如果存在则不改写 print(19,jedis.hgetAll(userKey)); //set String likeKey1="commentLike1"; String likeKey2="commentLike2"; for(int i=0;i<10 ; ++i){ jedis.sadd(likeKey1,String.valueOf(i)); jedis.sadd(likeKey2,String.valueOf(i*i)); } print(20,jedis.smembers(likeKey1)); print(21,jedis.smembers(likeKey2)); print(22,jedis.sunion(likeKey1,likeKey2));//求并 print(23,jedis.sdiff(likeKey1,likeKey2));//我有你无 print(24,jedis.sinter(likeKey1,likeKey2)); //求公共的 print(25,jedis.sismember(likeKey1,"12")); print(25,jedis.sismember(likeKey2,"16")); //查询对象在不在里面 jedis.srem(likeKey1,"5"); print(27 大专栏 Spring Boot 之 Redis详解,jedis.smembers(likeKey1)); User user = new User(); user.setName("xx"); user.setPassword("ppp"); user.setHeadUrl("a.png"); user.setSalt("salt"); user.setId(1); print(46,JSONObject.toJSONString(user)); jedis.set("user1",JSONObject.toJSONString(user)); String value = jedis.get("user1"); User user2=JSON.parseObject(value,User.class); print(47,user2); int k=2; } @Override public void afterPropertiesSet() throws Exception { }}
Redis事务
redis事务可以一次执行多个命令,并且有以下2个属性:
事务是一个单独的隔离操作,事务中所有命令都会序列化,按顺序地执行,事务在执行的过程中,不会被其他客户端发送过来的命令请求所中断
事务是一个原子操作,事务中的命令要不全部被执行,要不都不执行
一个事务从开始到执行有三个阶段 :
开始事务
命令入队
执行事务
实例:
先以MULTI开始一个事务,然后将多个命令入队到事务中,最后由EXEC命令触发事务,一并执行事务中的所有命令
12345678910111213141516
127.0.0.1:6379> MULTIOK127.0.0.1:6379> set book-name "Java Thinking in"QUEUED127.0.0.1:6379> GET book-nameQUEUED127.0.0.1:6379> SADD tag "JAVA" "Coding"QUEUED127.0.0.1:6379> SMEMBERS tagQUEUED127.0.0.1:6379> EXEC1) OK2) "Java Thinking in"3) (integer) 24) 1) "JAVA" 2) "Coding"
事务相关命令:
DISCARD:取消事务discard,放弃执行事务中所有命令
EXEC:执行所有事务块内的命令 exec
MULTI:标记一个事务块的开始multi
UNWATCH:取消watch命令对所有key的监视
Redis脚本
Redis脚本用Lua解释器来执行脚本,脚本执行的命令为EVAL
12345
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2"3) "first"4) "second"
Redis 连接
Redis连接服务器
12345
127.0.0.1:6379> AUTH "password"(error) ERR Client sent AUTH, but no password is set //没有密码,所以...127.0.0.1:6379> pingPONG127.0.0.1:6379>
连接命令:
AUTH password:验证密码是否正确
PONG:查看服务器是否运行
ECHO message : 打印字符串
QUIT:关闭当前连接
SELECT index :切换到指定的数据库
Java使用Redis
添加jedis.jar 包
然后就可以嗨起来了
连接服务器
1234567891011121314
import redis.clients.jedis.Jedis;public class RedisJava { public static void main(String [] args){ //连接本地的Redis服务 Jedis jedis =new Jedis("localhost"); System.out.println("连接成功"); //查看服务器是否运行 System.out.println("服务正在运行:"+jedis.ping()); }}--- 连接成功服务正在运行:PONG
字符串
1234567891011121314
import redis.clients.jedis.Jedis;public class RedisJava { public static void main(String [] args){ //连接本地的Redis服务 Jedis jedis =new Jedis("localhost"); System.out.println("连接成功"); jedis.set("damin","zhoudm.com"); System.out.println("redis 存储的字符串为:"+jedis.get("damin")); }}---连接成功redis 存储的字符串为:zhoudm.com
Redis Java List
12345678910111213141516171819202122232425
import redis.clients.jedis.Jedis;import java.util.List;public class RedisJava { public static void main(String [] args){ //连接本地的Redis服务 Jedis jedis =new Jedis("localhost"); System.out.println("连接成功"); jedis.lpush("zhoudm","zhoudm.com"); jedis.lpush("zhoudm","baidu.com"); jedis.lpush("zhoudm","360.com"); jedis.lpush("zhoudm","google.com"); List<String> list=jedis.lrange("zhoudm",0,3); for(int i=0;i<list.size();i++) { System.out.println("列表为:" + list.get(i)); } }}---连接成功列表为:google.com列表为:360.com列表为:baidu.com列表为:zhoudm.com
Redis Java Keys
1234567891011121314151617181920212223242526272829303132333435363738394041
import redis.clients.jedis.Jedis;import java.util.Set;import java.util.Iterator;public class RedisJava { public static void main(String [] args){ //连接本地的Redis服务 Jedis jedis =new Jedis("localhost"); System.out.println("连接成功"); Set<String> keys=jedis.keys("*"); Iterator<String> it=keys.iterator(); while(it.hasNext()){ String key = it.next(); System.out.println(key); } }}--- 连接成功zhoudmspring:session:sessions:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507book-namespring:session:sessions:9a02f60c-fd16-49b5-9977-08446f4ffff5spring:session:sessions:f1312270-95cf-4d19-a88d-5af26b03a61cspring:session:sessions:expires:9a02f60c-fd16-49b5-9977-08446f4ffff5spring:session:expirations:1504881480000user:1spring:session:sessions:f31624a8-b014-4768-826d-8b5b484b63a7collectorspring:session:sessions:expires:f1312270-95cf-4d19-a88d-5af26b03a61cspring:session:sessions:expires:f31624a8-b014-4768-826d-8b5b484b63a7namespring:session:expirations:1504409460000daminrunoobtagspring:session:expirations:1505295120000spring:session:expirations:1504252440000spring:session:sessions:expires:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507