Redis入门简介

81 阅读7分钟

1.NoSQL介绍

NoSQL(Not Only SQL) 泛指非关系型数据库。NoSQL数据库并不是取代关系型数据库,而是关系型数据库的补充 。

关系型数据库(RDBMS): Relational Database Management System。全都是以的形式存储数据,以约束维护数据关系,有事务

  • 数据、操作都非常的严谨,不容易出错

  • 三高问题:

    高并发问题:关系型数据库如果要提供高并发的能力,需要的代价比较大。

    高性能问题:快速从海量数据里找到并操作某些数据,成本高昂

    高扩展性问题:集群+分布式,数据库增加、减少节点,或者做数据的迁移 都非常麻烦

  • 比如:Mysql,Oracle,DB2,SQLServer

非关系型数据库(NoSql): 泛指一切不以表形式存储数据、不使用约束维护关系的数据库

  • 特点:更大的优势是在于“灵活”,而不是“严谨”
    • 存储数据的模式非常灵活。不以表的形式存储,以什么形式存储的?有各种各样不同的数据库,采用不同的存储形式
    • 扩展性和操作性能非常好。这些数据库都是在 大数据量、高并发的情况下,逐渐产生的一些解决方案数据库
    • 非关系型数据库,通常缺乏有效的事务管控。
  • 例如:
    • Redis:键值对结构的数据库。可以把Redis看成一个超级大的独立的HashMap。性能极强
    • MongoDB:文档型数据库。每一条数据存储成一个json对象
    • HBase:列式数据库。可以很方便的存储海量的数据
    • Neo4J:图数据库。更适合于维护拓扑结构的关系,比如社交关系
    • ……

2.Redis介绍

Redis是用C语言开发的一个开源的高性能键值对数据库,而且为了进一步提升性能,Redis把数据存储到内存里,所以它有极高的读写性能。

3.Redis数据类型 ★

五种常用数据类型

Redis的数据,是键值对结构的 key-value

key : 始终是字符串或者字节数组。最大512MB

value :又分为5种常用的类型

  • string:字符串
  • hash:哈希结构。相当于Java里的HashMap
  • list:链表结构。相当于Java里的LinkedList
  • set:无序不重复的数据集合。相当于Java里的HashSet
  • zset:也叫sorted set,有序不重复的集合

image-20240330145405851.png

Redis常用命令

1.字符串操作命令

命令说明
set key value存储数据。如果key已经存在,就覆盖掉它的value;如果key不存在,就存储进去
get key获取key对应的value值
del key删除key
setex key 秒数 value存储数据,并设置有效期,单位是秒
setnx key value存储数据。但是只有在key不存在的情况下,才可以存储进去。如果key已存在,会存储失败

操作

127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set verify_code 123456
OK
127.0.0.1:6379> get verify_code
"123456"
127.0.0.1:6379> setnx verify_code 11111   # verify_code 存在存储失败
(integer) 0
127.0.0.1:6379> get verify_code
"123456"
127.0.0.1:6379>  set verify_code 2222     # 直接覆盖verify_code
OK
127.0.0.1:6379> get verify_code
"2222"
127.0.0.1:6379> setex code 10 asdff
OK
127.0.0.1:6379> get code
"asdff"
127.0.0.1:6379> get code                  #10秒后自动消失
(nil)

2.哈希操作命令

命令说明
hset key field value存储数据。把field-value存储到key对应的hash表里
hget key field获取数据。从key对应的hash表里,找到field对应的值
hdel key field删除数据。从key对应的hash表里,删除掉field
hkeys key获取key对应的hash表中所有的field
hvals key获取key对应的hash表里所有的value
hgetall key获取key对应的hash中所有的field-value对

操作

127.0.0.1:6379> hset stu name tom
(integer) 1
127.0.0.1:6379> hset stu old 18
(integer) 1
127.0.0.1:6379> hset stu gender 1
(integer) 1
127.0.0.1:6379> hget stu name
"tom"
127.0.0.1:6379> hdel stu gender
(integer) 1
127.0.0.1:6379> hkeys stu
1) "name"
2) "old"
127.0.0.1:6379> hvals stu
1) "tom"
2) "18"
127.0.0.1:6379> hgetall stu
1) "name"
2) "tom"
3) "old"
4) "18"

3.列表操作命令

命令说明
LPUSH key value1 [value2]将一个或多个值,从队列的左边插入进去
LRANGE key start stop获取列表指定范围内的元素。start和stop是索引值(从0开始的,0表示第1个)
RPOP key移除并获取列表最后一个元素
LLEN key获取列表长度
BRPOP key1 [key2 ] timeout移出并获取列表的最后一个元素; 如果列表没有元素将会阻塞列表,直到等待超时或发现可弹出元素为止

操作

127.0.0.1:6379> lpush name tom jack luck mark
(integer) 4
127.0.0.1:6379> lrange name 0 -1	#从name对应的列表里,查询索引0到最后的数据(包含头和尾)
1) "mark"
2) "luck"
3) "jack"
4) "tom"
127.0.0.1:6379> rpop name
"tom"
127.0.0.1:6379> lrange name 0 -1
1) "mark"
2) "luck"
3) "jack"
127.0.0.1:6379> llen name
(integer) 3
127.0.0.1:6379> brpop name 5      #移除并获取列表的最后一个元素
1) "name"
2) "jack"
127.0.0.1:6379> rpop name
"luck"
127.0.0.1:6379> rpop name
"mark"
127.0.0.1:6379> rpop name
(nil)
127.0.0.1:6379> brpop name 5      # 如果列表没有元素将会阻塞列表,直到等待超时或发现可弹出元素为止
(nil)
(5.04s)

4.集合操作命令

命令说明
SADD key member1 [member2]向集合添加一个或多个成员
SMEMBERS key返回集合中的所有成员
SCARD key获取集合的成员数
SINTER key1 [key2]返回给定所有集合的交集
SUNION key1 [key2]返回所有给定集合的并集
SREM key member1 [member2]移除集合中一个或多个成员

操作

127.0.0.1:6379> sadd name tom jack mark lucy
(integer) 4
127.0.0.1:6379> smembers name
1) "lucy"
2) "tom"
3) "mark"
4) "jack"
127.0.0.1:6379> scard name
(integer) 4
127.0.0.1:6379> sadd name1 tom jack tony zero
(integer) 4
127.0.0.1:6379> sinter name name1
1) "tom"
2) "jack"
127.0.0.1:6379> sunion name name1
1) "tony"
2) "jack"
3) "lucy"
4) "tom"
5) "zero"
6) "mark"
127.0.0.1:6379>  srem name mark
(integer) 1
127.0.0.1:6379> smembers name
1) "lucy"
2) "tom"
3) "jack"

5.有序集合操作命令

命令说明
ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES]通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...]移除有序集合中的一个或多个成员

操作

127.0.0.1:6379> zadd myzset 30 zhangsan 40 lisi 50 wangwu 60 zhaoliu 70 qianqi  #向key为myzset的有序集合里添加成员
(integer) 5
127.0.0.1:6379> zrank myzset lisi           #从myzset里查询lisi的名次(从0开始的)
(integer) 1
127.0.0.1:6379> zrank myzset zhangsan       #从myzset里查询zhangsan的名次(从0开始的)
(integer) 0
127.0.0.1:6379> zscore myzset zhangsan      #从myzset里查询zhangsan的分值
"30"
127.0.0.1:6379> zrange myzset 0 2           #从myzset里从索引0(排名0)查询到索引2(排名2)的成员,包含头尾
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrange myzset 0 2 withscores #从myzset里从索引0(排名0)查询到索引2(排名2)成员及分值,包含头尾,
1) "zhangsan"
2) "30"
3) "lisi"
4) "40"
5) "wangwu"
6) "50"
127.0.0.1:6379> zrange myzset 0 -1 withscores #从myzset里从索引0(排名0)查询到索最后1个 成员及分值,包含头尾,
 1) "zhangsan"
 2) "30"
 3) "lisi"
 4) "40"
 5) "wangwu"
 6) "50"
 7) "zhaoliu"
 8) "60"
 9) "qianqi"
10) "70"
127.0.0.1:6379> zincrby myzset 100 zhangsan #给myzset里zhangsan成员的分值,增加上100
"130"
127.0.0.1:6379> zrange myzset 0 -1 withscores #查询所有成员及分值,发现zhangsan的分值和排名已经变了
 1) "lisi"
 2) "40"
 3) "wangwu"
 4) "50"
 5) "zhaoliu"
 6) "60"
 7) "qianqi"
 8) "70"
 9) "zhangsan"
10) "130"
127.0.0.1:6379> zincrby myzset -100 zhangsan  #给myzset里zhangsan成员的分值,增加上-100
"30"
127.0.0.1:6379> zrem myzset zhangsan          #从myzset里删除掉zhangsan成员
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1            #再查询所有成员,发现zhangsan已经被删除掉了
1) "lisi"
2) "wangwu"
3) "zhaoliu"
4) "qianqi"
127.0.0.1:6379>

6.通用命令

命令说明
KEYS pattern查找所有符合给定模式( pattern)的 key
EXISTS key检查给定 key 是否存在
TYPE key返回 key 所储存的值的类型
DEL key该命令用于在 key 存在是删除 key

操作

127.0.0.1:6379> keys *
1) "name"
2) "name1"
3) "verify_code"
4) "stu"
127.0.0.1:6379>  keys na*
1) "name"
2) "name1"
127.0.0.1:6379> keys name?
1) "name1"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists aaa
(integer) 0
127.0.0.1:6379> type name
set
127.0.0.1:6379> del name1
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "verify_code"
3) "stu"