redis

redis详细操作(Redis使用教程)(1)

概念: redis是一款高性能的nosql系列的非关系型数据库

  1. 什么是 NOSQL?
  2. NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
  3. 随着互联网web2.0网站(动态网站)的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
  4. ### NOSQL和关系型数据库比较
  1. 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
  2. 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
  3. 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
  4. 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
  1. 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
  2. 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
  3. 不提供关系型数据库对事务的处理。
  4. 非关系型数据库的优势:
  5. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
  6. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
  7. 关系型数据库的优势:
  8. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  9. 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
  10. 总结
  11. 关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,
  12. 让NoSQL数据库对关系型数据库的不足进行弥补。
  13. 一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
  14. ### 主流的NOSQL产品
  1. 什么是Redis
  2. Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求。
  1. 字符串类型 string
  2. 哈希类型 hash
  3. 列表类型 list
  4. 集合类型 set
  5. 有序集合类型 sortedset

下载安装

  1. 官网:https://redis.io
  2. 中文网:http://www.redis.net.cn/
  3. 解压直接可以使用:

命令操作

  1. macOS下的操作命令:
  2. 默认端口: 6379
  3. redis-server和 redis-cli分别是服务器和客户端
  4. redis-server和 redis-cli位于 redis-5.0.4/src目录下

redis详细操作(Redis使用教程)(2)

  1. ### Redis的数据结构:
  1. 字符串类型 string
  2. 哈希类型 hash : map格式
  3. 列表类型 list : linkedlist格式。支持重复元素
  4. 集合类型 set : 不允许重复元素
  5. 有序集合类型 sortedset:不允许重复元素,且元素有顺序
  6. 字符串类型 string
  7. 存储: setkey value
  8. bash
  9. 127.0.0.1:6379>setusername zhangsan
  10. OK
  11. 获取: getkey
  12. bash
  13. 127.0.0.1:6379>getusername
  14. "zhangsan"
  15. 删除: delkey
  16. bash
  17. 127.0.0.1:6379>delage
  18. (integer)1
  19. 查看 key 是否存在: exists key
  20. bash
  21. 127.0.0.1:6379>exists name
  22. (integer)1
  23. 查看所有的 key: keys*
  24. bash
  25. 127.0.0.1:6379>keys*
  26. 1)"name"
  27. 消除所有的 key:flushall
  28. bash
  29. 127.0.0.1:6379>flushall
  30. OK
  31. 哈希类型 hash
  32. 存储: hset key field value
  33. bash
  34. 127.0.0.1:6379>hset myhash username lisi
  35. (integer)1
  36. 127.0.0.1:6379>hset myhash password123
  37. (integer)1
  38. 获取:

127.0 . 0.1 : 6379 > hget myhash username "lisi"

127.0 . 0.1 : 6379 > hgetall myhash 1 ) "username" 2 ) "lisi" 3 ) "password" 4 ) "123"

  1. 删除: hdel key field
  2. bash
  3. 127.0.0.1:6379>hdel myhash username
  4. (integer)1
  5. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
  6. 添加:
  7. lpush key value: 将元素加入列表左表(链表结构)
  8. rpush key value:将元素加入列表右边

127.0 . 0.1 : 6379 > lpush myList a ( integer ) 1 127.0 . 0.1 : 6379 > lpush myList b ( integer ) 2 127.0 . 0.1 : 6379 > rpush myList c ( integer ) 3

  1. 获取:

127.0 . 0.1 : 6379 > lrange myList 0 - 1 1 ) "b" 2 ) "a" 3 ) "c"

  1. 删除:
  1. 集合类型 set : 不允许重复元素
  2. 存储: sadd key value
  3. bash
  4. 127.0.0.1:6379>sadd myset a
  5. (integer)1
  6. 127.0.0.1:6379>sadd myset a
  7. (integer)0
  8. 获取: smembers key:获取set集合中所有元素
  9. bash
  10. 127.0.0.1:6379>smembers myset
  11. 1)"a"
  12. 删除: srem key value:删除set集合中的某个元素
  13. bash
  14. 127.0.0.1:6379>srem myset a
  15. (integer)1
  16. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。
  17. 存储: zadd key score value
  18. bash
  19. 127.0.0.1:6379>zadd mysort60zhangsan
  20. (integer)1
  21. 127.0.0.1:6379>zadd mysort50lisi
  22. (integer)1
  23. 127.0.0.1:6379>zadd mysort80wangwu
  24. (integer)1
  25. 获取: zrange key startend[withscores]
  26. bash
  27. 127.0.0.1:6379>zrange mysort0-1
  28. 1)"lisi"
  29. 2)"zhangsan"
  30. 3)"wangwu"
  31. 127.0.0.1:6379>zrange mysort0-1withscores
  32. 1)"zhangsan"
  33. 2)"60"
  34. 3)"wangwu"
  35. 4)"80"
  36. 5)"lisi"
  37. 6)"500"
  38. 删除: zrem key value
  39. bash
  40. 127.0.0.1:6379>zrem mysort lisi
  41. (integer)1
  42. 通用命令
  43. keys* : 查询所有的键
  44. type key : 获取键对应的value的类型
  45. delkey:删除指定的key value
  46. 持久化
  47. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
  48. redis持久化机制:
  49. RDB:默认方式,不需要进行配置,默认就使用这种机制

# after 900 sec (15 min) if at least 1 key changed save 900 1 # after 300 sec (5 min) if at least 10 keys changed save 300 10 # after 60 sec if at least 10000 keys changed # 60秒内有10000个key改变就持久化保存一次,保存为.rdb文件 save 60 10000

redis - server / usr / local / etc / redis . conf

  1. AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
  2. 编辑redis.conf文件

appendonly no (关闭 AOF ) --> appendonly yes (开启 AOF ) appendfsync always : 每一次操作都进行持久化(默认被注释) appendfsync everysec : 每隔一秒进行一次持久化 appendfsync no : 不进行持久化(默认被注释)

Java客户端 Jedis

  1. 导入jedis的jar包
  2. jedis-2.9.0.jar commons-pool2-2.3.jar
  3. 使用
  4. java
  5. //1.获取连接
  6. Jedisjedis=newJedis("127.0.0.1",6379);//如果使用空参构造,默认值 "localhost",6379端口
  7. //2.操作
  8. jedis.set("name","hah");
  9. //3.关闭连接
  10. jedis.close();
  1. 字符串类型 string
  2. ```java
  3. set
  4. get
  5. //1. 获取连接
  6. Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
  7. //2. 操作
  8. //存储
  9. jedis.set("username","zhangsan");
  10. //获取
  11. String username = jedis.get("username");
  12. System.out.println(username);
  13. //可以使用setex()方法存储可以指定过期时间的 key value
  14. jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
  15. //3. 关闭连接
  16. jedis.close();
  17. ```
  18. 哈希类型 hash : map格式
  19. ```java
  20. hset
  21. hget
  22. hgetAll
  23. //1. 获取连接
  24. Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
  25. //2. 操作
  26. // 存储hash
  27. jedis.hset("user","name","lisi");
  28. jedis.hset("user","age","23");
  29. jedis.hset("user","gender","female");
  30. // 获取hash
  31. String name = jedis.hget("user", "name");
  32. System.out.println(name);
  33. // 获取hash的所有map中的数据
  34. Map user = jedis.hgetAll("user");
  35. // keyset
  36. Set keySet = user.keySet();
  37. for (String key : keySet) {
  38. //获取value
  39. String value = user.get(key);
  40. System.out.println(key ":" value);
  41. }
  42. //3. 关闭连接
  43. jedis.close();
  44. ```
  45. 列表类型 list : linkedlist格式。支持重复元素
  46. ```java
  47. lpush / rpush
  48. lpop / rpop
  49. lrange start end : 范围获取
  50. //1. 获取连接
  51. Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
  52. //2. 操作
  53. // list 存储
  54. jedis.lpush("mylist","a","b","c");//从左边存
  55. jedis.rpush("mylist","a","b","c");//从右边存
  56. // list 范围获取
  57. List mylist = jedis.lrange("mylist", 0, -1);
  58. System.out.println(mylist);
  59. // list 弹出(删除)
  60. String element1 = jedis.lpop("mylist");//c
  61. System.out.println(element1);
  62. String element2 = jedis.rpop("mylist");//c
  63. System.out.println(element2);
  64. // list 范围获取
  65. List mylist2 = jedis.lrange("mylist", 0, -1);
  66. System.out.println(mylist2);
  67. //3. 关闭连接
  68. jedis.close();
  69. ```
  70. 集合类型 set : 不允许重复元素
  71. ```java
  72. sadd
  73. smembers:获取元素
  74. //1. 获取连接
  75. Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
  76. //2. 操作
  77. // set 存储
  78. jedis.sadd("myset","java","php","c ");
  79. // set 获取
  80. Set myset = jedis.smembers("myset");
  81. System.out.println(myset);
  82. //3. 关闭连接
  83. jedis.close();
  84. ```
  85. 有序集合类型 sortedset:不允许重复元素,且元素有顺序
  86. ```java
  87. zadd
  88. zrange
  89. //1. 获取连接
  90. Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
  91. //2. 操作
  92. // sortedset 存储
  93. jedis.zadd("mysortedset",3,"亚瑟");
  94. jedis.zadd("mysortedset",30,"后裔");
  95. jedis.zadd("mysortedset",55,"孙悟空");
  96. // sortedset 获取
  97. Set mysortedset = jedis.zrange("mysortedset", 0, -1);
  98. System.out.println(mysortedset);
  99. //3. 关闭连接
  100. jedis.close();
  101. ```
  1. 创建JedisPool连接池对象
  2. 调用方法 getResource()方法获取Jedis连接
  3. 示例:

//0.创建一个配置对象 JedisPoolConfig config = new JedisPoolConfig (); config . setMaxTotal ( 50 ); config . setMaxIdle ( 10 ); //1.创建Jedis连接池对象 JedisPool jedisPool = new JedisPool ( config , "localhost" , 6379 ); //2.获取连接 Jedis jedis = jedisPool . getResource (); //3. 使用 jedis . set ( "hehe" , "heihei" ); //4. 关闭 归还到连接池中 jedis . close ();

public class JedisPoolUtils { private static JedisPool jedisPool ; static { //读取配置文件 InputStream is = JedisPoolUtils . class . getClassLoader (). getResourceAsStream ( "jedis.properties" ); //创建Properties对象 Properties pro = new Properties (); //关联文件 try { pro . load ( is ); } catch ( IOException e ) { e . printStackTrace (); } //获取数据,设置到JedisPoolConfig中 JedisPoolConfig config = new JedisPoolConfig (); config . setMaxTotal ( Integer . parseInt ( pro . getProperty ( "maxTotal" ))); config . setMaxIdle ( Integer . parseInt ( pro . getProperty ( "maxIdle" ))); //初始化JedisPool jedisPool = new JedisPool ( config , pro . getProperty ( "host" ), Integer . parseInt ( pro . getProperty ( "port" ))); } /** * 获取连接方法 */ public static Jedis getJedis (){ return jedisPool . getResource (); } }

,