• redis


    Redis 非关系型数据库,缓存型数据库

    关系型数据库和非关系型数据的区别

    关系型数据库是一个机构化的数据库,和列

    列声明对象

    行,纪录对象的属性

    表与表之间是有关联,使用sql语句,来对指定的表,库,进行增删改查

    在创建表时,我们是设计好了表的结构,按照表结构来存储数据,数据与表表结构不匹配,存储数据,会失败

    非关系型数据库:nosql not only sql

    不需要定义库,也不需要定义表结构,直接纪录即可,而且每条纪录都可以有不同的数据类型,字段(字段个数)

    Redis key:value 键值对形式存储,每个键之间没有直接关联。库与库之间互相独立

    区别

    1、数据的存储方式不同

    2、扩展方式不同,性能上的提升,关系型数据库靠的是提升本机性能,非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能

    3、对事务的支持性,mysql支持事务

    原子性

    隔离性

    一致性

    持久性

    非关系型数据库也支持事务,Redis也可以支持事务,但是稳定性和处理能力都不如关系型数据库

    非关系数据库的主要场景

    1、操作的扩展

    2、海量数据处理

    web2.0:交互

    纯动态网站的三高问题

    1、对数据库高并发读写的需求

    2、对海量数据高效存储与访问的需求

    3、对数据的高可扩展性与高可用性的需求

    常见的缓存需求场景

    数据库缓存

    web页面缓存

    CPU和硬盘之间缓存

    关系型数据库

    库----表-----行,列-------->存储对象

    非关系数据库

    库-----集合------>键值对

    不需要手动的创建库和集合

    Redis:开源的,使用C语言编写的NQL数据库

    Redis:基于内存运行,支持持久化(数据恢复),采用的就是key-value(键值对)的存储形式,目前在分布式架构中,非常重要的一环

    Redis服务器程序,是一个单进程模式,即只有一个主进程工作,也就是说在一台服务器上可以启动多个Redis(端口号不能冲突)

    Redis的实际处理速度是完全依靠主进程的执行效率

    服务器值部署了一个Redis进程,多个客户端访问,可能会导致Redis的处理能力下降,如果部署了多个进程,虽然能提高Redis的并发处理能力,但是会给服务器的CPU带来很大的压力

    一台服务器,一般部署3个Redis进程 (根据情况而看,高并发,要部署多个,一般的情况,单进程足够)

    Redis的特点

    1、具有极高的读写速度,数据读写每秒110000次,写入数据每秒可以执行81000的写入

    2、支持丰富的数据类型

    3、支持持久化,平常数据保存在内存中,持久化可以写入到磁盘中,既可以保存到本地,也可以实现备份

    4、原子性,所有的操作都是原子性

    5、支持主从模式----master-slave模式

    部署Redis
    1. 把源码拖进opt目录下
    2. 关闭防火墙和安全机制
    3. yum install -y gcc gcc-c++ make
    4. 解压源码包
    5. 进入解压之后的目录
    6. cd /redis-5.0.7/
    7. 编译安装
    8. make -j 4 && make install
    9. make PREFIX=/usr/local/redis install
    10. cd utils
    11. ./install_server.sh
    12. 4个回车
    13. /usr/local/redis/bin/redis-server
    14. ln -s /usr/local/redis/bin/* /usr/local/bin/
    15. netstat -antp | grep redis
    16. /etc/init.d/redis_6379 status
    17. vim /etc/redis/6379.conf
    18. 70
    19. bind 127.0.0.1 20.0.0.20
    20. /etc/init.d/redis_6379 restart
    21. netstat -antp | grep redis
    redis的命令工具
    1. Redis-server:直接启动Redis ,只能启动
    2. Redis-benchmark:检测Redis在本机上的运行效率
    3. Redis-cli: 命令行工具
    4. Redis-check-aof:检测AOF文件是否正常
    5. Redis-check-rdb:检测rdb文件是否正常

    Redis-benchmark的语法

    1. -h:指定服务器的主机名IP地址
    2. -p:指定服务器端口号
    3. -c:指定并发连接数
    4. -n:指定请求数
    redis的数据类型

    1、如何进入redis?

    1. redis-cli -h 20.0.0.20 -p 6379
    2. -h 指定IP地址
    3. -p 指定端口号
    4. -a 指定登录密码
    redis数据类型 五大数据类型

    1、string(字符串):也是redis最近本的类型,最大能存储512MB的数据,可以存储任何数据,数字,蚊子,图片等等

    1. 展示有多少的键值对
    2. keys *
    3. 20.0.0.20:6379> keys t*
    4. 1) "test"
    5. 创建键
    6. set test xiaobu
    7. 20.0.0.20:6379> set test xiaobu
    8. OK
    9. 查看键
    10. get test
    11. 20.0.0.20:6379> get test
    12. "xiaobu"
    13. * 任意字符
    14. 20.0.0.20:6379> keys t*
    15. 1) "test"
    16. keys t??? 表示两个字符
    17. 20.0.0.20:6379> keys t???
    18. 1) "test"
    19. EXISTS 键名
    20. 返回值为1 已创建
    21. 20.0.0.20:6379> exists test
    22. (integer) 1
    23. 返回值为0 未创建
    24. 20.0.0.20:6379> exists tests
    25. (integer) 0
    26. 删除多个键
    27. del 键名1 键名2
    28. 20.0.0.20:6379> del test1 test
    29. (integer) 2
    30. 20.0.0.20:6379> keys *
    31. (empty list or set)
    32. APPEND test1 hello
    33. APPEND test1 world
    34. 20.0.0.20:6379> append test hello
    35. (integer) 5
    36. 20.0.0.20:6379> append test world
    37. (integer) 10
    38. 20.0.0.20:6379> get test
    39. "helloworld"
    40. 该键自增
    41. INCR test1
    42. 20.0.0.20:6379> incr test1
    43. (integer) 11
    44. 20.0.0.20:6379> get test1
    45. "11"
    46. 该键自减
    47. decr test1
    48. 指定增加
    49. incrby test1 30
    50. 20.0.0.20:6379> incrby test1 10
    51. (integer) 40
    52. 20.0.0.20:6379> get test1
    53. "40"
    54. 指定减少
    55. decrby test1 35
    56. 20.0.0.20:6379> decrby test1 35
    57. (integer) 5
    58. 20.0.0.20:6379> get test1
    59. "5"
    60. 给新键值设置生命周期
    61. setex test2 15 lo
    62. 查看生命周期
    63. ttl test2
    64. 20.0.0.20:6379> setex test2 15 lo
    65. OK
    66. 20.0.0.20:6379> ttl test2
    67. (integer) 9
    68. 20.0.0.20:6379> ttl test2
    69. (integer) 8
    70. .......
    71. 20.0.0.20:6379> ttl test2
    72. (integer) 2
    73. 20.0.0.20:6379> ttl test2
    74. (integer) 1
    75. 20.0.0.20:6379> ttl test2
    76. (integer) -2
    77. -1 永不过期
    78. -2 表示已经过期
    79. 对已有键值设置生命周期
    80. expire test 30
    81. 20.0.0.20:6379> EXPIRE test 30
    82. (integer) 1
    83. 20.0.0.20:6379> ttl test
    84. (integer) 22
    85. 20.0.0.20:6379> ttl test
    86. (integer) 21
    87. 20.0.0.20:6379> ttl test
    88. (integer) 19
    89. ......
    90. 20.0.0.20:6379> ttl test
    91. (integer) 13
    92. 20.0.0.20:6379> ttl test
    93. (integer) 11
    94. 20.0.0.20:6379> ttl test
    95. (integer) 10
    96. 创建多个键
    97. mset key1 hello key2 world
    98. 查看多个键
    99. mget key1 key2
    100. 20.0.0.20:6379> mset key1 hello key2 world
    101. OK
    102. 20.0.0.20:6379> mget key1 key2
    103. 1) "hello"
    104. 2) "world"

    2、list数据类型

    列表当中的元素还是string

    1. 创建倒序列表
    2. lpush 列表名称 1 2 3 4 5
    3. 20.0.0.20:6379> lpush test 1 2 3 4 5
    4. (integer) 5
    5. 查看列表(倒序)
    6. lrange 列表名称 0 -1
    7. 20.0.0.20:6379> lrange test 0 -1
    8. 1) "5"
    9. 2) "4"
    10. 3) "3"
    11. 4) "2"
    12. 5) "1"
    13. 0表示第一个数
    14. -1表示最后一个数
    15. 指定索引值查看对应值
    16. lindex 列表名称 0
    17. 20.0.0.20:6379> lindex test 0
    18. "5"
    19. 20.0.0.20:6379> lindex test 4
    20. "1"
    21. 创建正序列表
    22. rpush 链表名称 1 2 3 4
    23. 20.0.0.20:6379> rpush test1 1 2 3 4 5
    24. (integer) 5
    25. 查看列表
    26. lrange 列表名称 0 -1
    27. 20.0.0.20:6379> lrange test1 0 -1
    28. 1) "1"
    29. 2) "2"
    30. 3) "3"
    31. 4) "4"
    32. 5) "5"
    33. 指定索引值查看对应值
    34. lindex 列表名称 0
    35. 20.0.0.20:6379> lindex test1 3
    36. "4"
    37. 查看元素
    38. llen 列表名称
    39. 修改设置的索引值
    40. lset 列表名称 索引值
    41. 20.0.0.20:6379> lset test1 1 11
    42. OK
    43. 在指定位置前面插入
    44. linsert 列表名称 before 3 xiaobu
    45. 20.0.0.20:6379> linsert test1 before 3 xiaobu
    46. (integer) 6
    47. 在上下插入值
    48. lpush test1 xiao (在上插入)
    49. 20.0.0.20:6379> lpush test1 10
    50. (integer) 7
    51. 20.0.0.20:6379> lrange test1 0 -1
    52. 1) "10"
    53. 2) "1"
    54. 3) "11"
    55. 4) "xiaobu"
    56. 5) "3"
    57. 6) "4"
    58. 7) "5"
    59. rpush test1 12 (从下插入)
    60. 20.0.0.20:6379> rpush test1 12
    61. (integer) 8
    62. 20.0.0.20:6379> lrange test1 0 -1
    63. 1) "10"
    64. 2) "1"
    65. 3) "11"
    66. 4) "xiaobu"
    67. 5) "3"
    68. 6) "4"
    69. 7) "5"
    70. 8) "12"
    71. 删除上下
    72. lpop test1 (从上)
    73. 20.0.0.20:6379> lpop test1
    74. "10"
    75. 20.0.0.20:6379> lrange test1 0 -1
    76. 1) "1"
    77. 2) "11"
    78. 3) "xiaobu"
    79. 4) "3"
    80. 5) "4"
    81. 6) "5"
    82. 7) "12"
    83. rpop test1 (从下删除)
    84. 20.0.0.20:6379> rpop test1
    85. "12"
    86. 20.0.0.20:6379> lrange test1 0 -1
    87. 1) "1"
    88. 2) "11"
    89. 3) "xiaobu"
    90. 4) "3"
    91. 5) "4"
    92. 6) "5"

    3、hash类型

    hash类型用于存储对象,采用hash格式来进行操作,占用的磁盘空间少,而且一个hash可以存储42个键值对,可以存储多个键值

    1. hash 列表名称 tall yes
    2. 20.0.0.20:6379> hset test2 tall yes
    3. (integer) 1
    4. 查看列表
    5. hget 列表名称 tall
    6. 20.0.0.20:6379> hget test2 tall
    7. "yes"
    8. 添加新内容
    9. hset 列表名称 handsan yes
    10. 20.0.0.20:6379> hset test2 handsan 2
    11. (integer) 1
    12. 查看多个
    13. hmget 列表名称 tall handsan
    14. 20.0.0.20:6379> hmget test2 tall handsan
    15. 1) "yes"
    16. 2) "2"
    17. 添加字段
    18. hset 列表名称 age 20
    19. 20.0.0.20:6379> hset test2 age 22
    20. (integer) 1
    21. 查看多个
    22. hmget 列表名称 tall handsan age
    23. 20.0.0.20:6379> hmget test2 tall handsan age
    24. 1) "yes"
    25. 2) "2"
    26. 3) "22"
    27. 删除一个或者多个
    28. hdel 列表名称 handsan tall
    29. 20.0.0.20:6379> hmget test2 age
    30. 1) "22"
    31. 20.0.0.20:6379> hmget test2 tall handsan age
    32. 1) (nil)
    33. 2) (nil)
    34. 3) "22"
    35. 一次性设置多个字段
    36. hmset 列表名称 字段1 值1 字段2 值2 字段3 值3
    37. 20.0.0.20:6379> hmset test3 tall 1 handsan yes age 22
    38. OK
    39. 20.0.0.20:6379> hmget test3 tall handsan age
    40. 1) "1"
    41. 2) "yes"
    42. 3) "22"
    43. 查询所有(字段和值)
    44. hgetall 列表名称
    45. 20.0.0.20:6379> hgetall test3
    46. 1) "tall"
    47. 2) "1"
    48. 3) "handsan"
    49. 4) "yes"
    50. 5) "age"
    51. 6) "22"
    52. 查询字段
    53. hkeys 列表名称
    54. 20.0.0.20:6379> hkeys test3
    55. 1) "tall"
    56. 2) "handsan"
    57. 3) "age"
    58. 查看字段对应的值
    59. hvals 列表名称
    60. 20.0.0.20:6379> hvals test3
    61. 1) "1"
    62. 2) "yes"
    63. 3) "22"
    64. 删除列表
    65. del 列表名称

    4、set数据类型(无序集合)元素类型也是string元素是唯一的,不允许重复,多个集合类型可以进行并集,交集和差集运算

    set当中的元素类型是唯一的,可以跟踪一些唯一性的数据,访问微博的用户名,只要把对应名称redis ,set集合可以自动保存唯一性,方便下一次的访问

    1. 创建集合
    2. sadd 集合名称 a c
    3. 20.0.0.20:6379> sadd test a b c d
    4. (integer) 4
    5. 查看集合
    6. smembers 集合名称
    7. 20.0.0.20:6379> smembers test
    8. 1) "c"
    9. 2) "a"
    10. 3) "d"
    11. 4) "b"
    12. 查看集合中是否存在
    13. sismember 集合名称 c
    14. 返回值为1 表示存在
    15. 20.0.0.20:6379> sismember test b
    16. (integer) 1
    17. 返回值为0 表示不存在
    18. 20.0.0.20:6379> sismember test f
    19. (integer) 0
    20. 随机查看
    21. srandmember 集合名称
    22. 20.0.0.20:6379> srandmember test
    23. "a"
    24. 20.0.0.20:6379> srandmember test
    25. "c"
    26. 随机移除
    27. spop 集合名称
    28. 20.0.0.20:6379> spop test
    29. "b"
    30. 20.0.0.20:6379> smembers test
    31. 1) "c"
    32. 2) "a"
    33. 3) "d"
    34. 指定移除
    35. srem 集合名称 a b c
    36. 20.0.0.20:6379> srem test c a
    37. (integer) 2
    38. 20.0.0.20:6379> smembers test
    39. 1) "d"

    5、有序集合,有序集合,元素类型也是string,元素唯一,不能重复

    每个元素都会关联一个double(小数点) 的分数(sroce,表示权重),可以通过权重的大小,进行排序,元素的权重可以相同

    1. zset
    2. 在线积分的排行榜,可以实时更新用户的分数,可以使用zrange命令获取积分top10 的用户,zrank命令通过username来获取用户的排行信息
    3. 创建
    4. zadd 集合名称 权重 元素
    5. zadd myzset 1 one
    6. 20.0.0.20:6379> zadd test1 1 one
    7. (integer) 1
    8. 20.0.0.20:6379> zadd test1 1 one 2 two 3 three
    9. (integer) 2
    10. 查看集合(权重和元素)
    11. zrange 集合名称 0 -1 withscore
    12. 20.0.0.20:6379> zrange test1 0 -1 withscores
    13. 1) "one"
    14. 2) "1"
    15. 3) "two"
    16. 4) "2"
    17. 5) "three"
    18. 6) "3"
    19. 查看集合(元素)
    20. zrange 集合名称 0 -1
    21. 20.0.0.20:6379> zrange test1 0 -1
    22. 1) "one"
    23. 2) "two"
    24. 3) "three"
    25. 查看索引值
    26. zrank 集合名称 元素
    27. 20.0.0.20:6379> zrank test1 two
    28. (integer) 1
    29. 20.0.0.20:6379> zrank test1 three
    30. (integer) 2
    31. 20.0.0.20:6379> zrank test1 one
    32. (integer) 0
    33. 20.0.0.20:6379> zrank test1 four
    34. (nil)
    35. 查看成员数量
    36. zcard 集合名称
    37. 20.0.0.20:6379> zcard test1
    38. (integer) 3
    39. 统计权重1到2的范围 1<= score<=2
    40. zcount 集合名称 1 2
    41. 20.0.0.20:6379> zcount test1 1 2
    42. (integer) 2
    43. 20.0.0.20:6379> zcount test1 1 3
    44. (integer) 3
    45. 删除(权重)
    46. zrem 集合名称 元素
    47. 20.0.0.20:6379> zrem test1 one
    48. (integer) 1
    49. 20.0.0.20:6379> zrange test1 0 -1
    50. 1) "two"
    51. 2) "three"
    52. 查看元素的权重
    53. zscore 集合名称 元素
    54. 20.0.0.20:6379> zscore test1 two
    55. "2"
    56. 清空所有
    57. flushall

    set和hset 创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可

    对一个键进行多个字段存储,节省内存,使用hash方式

    改变键重命名

    1. set test 10
    2. get test
    3. 改变键名
    4. rename test xiaobu
    5. get xiaobu
    6. 20.0.0.20:6379> set test 10
    7. OK
    8. 20.0.0.20:6379> get test
    9. "10"
    10. 20.0.0.20:6379> rename test xiaobu
    11. OK
    12. 20.0.0.20:6379> keys *
    13. 1) "xiaobu"
    14. redis的库,库都是创建好的库,16个库
    15. 数字排名:0-15
    16. 查看当前库的键
    17. dbsize
    18. 切换库
    19. select 库值
    20. 20.0.0.20:6379> select 1
    21. OK
    22. 20.0.0.20:6379[1]>
    23. 移动键
    24. move 键名 库值
    25. 20.0.0.20:6379> keys *
    26. 1) "xiaobu"
    27. 20.0.0.20:6379> move xiaobu 1
    28. (integer) 1
    29. 20.0.0.20:6379> keys *
    30. (empty list or set)
    31. 20.0.0.20:6379> select 1
    32. OK
    33. 20.0.0.20:6379[1]> keys *
    34. 1) "xiaobu"
    35. 给redis设置密码
    36. config set requirepass 123456
    37. 在内声明密码
    38. auth 123456
    39. 20.0.0.20:6379[1]> config set requirepass 123456
    40. OK
    41. 20.0.0.20:6379[1]> auth 123456
    42. OK
    43. 在外声明密码
    44. redis-cli -h 20.0.0.20 -p 6379 -a 123456
    45. [root@redis1 utils]# redis-cli -h 20.0.0.20 -p 6379 -a 123456
    46. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    47. 20.0.0.20:6379> select 1
    48. OK
    49. 20.0.0.20:6379[1]> keys *
    50. 1) "xiaobu"
    51. 删除当前库
    52. flushdb
    53. 清除所有库
    54. flushall
    redis的特点

    1、读写速度快

    2、数据类型    1、string

                            2、list(string)

                            3、hash 对一个键进行多字段操作要用hash 节省内存空间

                            4、无序集合 set 元素不能重复,可以用来定义唯一值

                            5、有序集合zset,元素不能重复,但是权重可以相同,用来排名

  • 相关阅读:
    VideoMAE 论文阅读
    c++系列之string的模拟实现
    基于PHP+MySQL米步童鞋商城网站的设计与实现
    springbook 注解笔记
    华为设备配置大型网络WLAN基本业务
    前端src中图片img标签资源的几种写法?
    A First course in FEM —— matlab代码实现求解传热问题(稳态)
    SQLite 常用功能整合
    1008. 前序遍历构造二叉搜索树
    js解析文件
  • 原文地址:https://blog.csdn.net/qq_71147683/article/details/134506980