初识Redis

Redis是一种内存型Key-Value数据库,以其高速、支持多种数据结构和持久化等特点广泛应用。文章介绍了Redis的单线程模型、高可用和分布式概念,并详细讲解了Redis的五大数据类型,包括字符串、列表、集合、哈希和有序集合,以及各自的操作命令和应用场景。
摘要由CSDN通过智能技术生成

一、概述

1.什么是Redis?

Redis是一种支持网络,可基于内存也可以持久化的日志型,Key-Value数据库,提供了多种的API。它是一种非关系数据库,提供将内存通过网络远程共享的一种服务。Redis在高并发,低延迟环境要求比较高的场景应用广泛。

2.Redis的一些特性

速度快,单线程,持久化,支持多种数据结构,支持多种语言,支持Lua脚本,发布订阅,支持高可用和分布式。

3.单线程为什么快?

单线程具有纯内存,非阻塞,避免线程切换。一次只进行一条命令,拒绝长命令

4.高可用和分布式理解

高可用的含义是指当一台服务器宕机之后,服务器可以继续使用,以及数据不会丢失。一般可以采用主从备份的方式来实现。

分布式主要是指各个服务器用来完成不同系统的功能,通过整个服务器一起工作来完成一件事情。

二、Redis的五大数据类型

五大数据类型包括字符串,列表,集合,hash,有序集合

1.String

字符串是最常见的数据类型,也是redis的最基本的数据类型之一,radis中所有的key的类型都是字符串,一般保存在session信息场景,比较常用。

常见的命令

127.0.0.1:6379> set key1 value1  #设置键值对
OK
127.0.0.1:6379> set title ice ex 5  #设置自动过期时间
OK
127.0.0.1:6379> get title
   #5s之内查看
"ice"
127.0.0.1:6379> get title
  #5s之后查看
(nil)
127.0.0.1:6379> set NAME ice  #区别大小写
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name ice
OK
127.0.0.1:6379> set name frost nx  #当name不存在时,才会给name赋值
(nil)
127.0.0.1:6379> get name
"ice"

127.0.0.1:6379> set name frost xx  #当
name存在时,才会对name覆盖
OK
127.0.0.1:6379> get name
"frost"
#获取对个值
127.0.0.1:6379> set name ice
OK
127.0.0.1:6379> set name1 frost
OK
127.0.0.1:6379> mget name name1
1) "ice"
2) "frost"
#删除值
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
#批量设置多个key
127.0.0.1:6379> mset k1 frost k2 ice k3 cold
OK
127.0.0.1:6379> mget k1 k2
1) "frost"
2) "ice"
#查看所有的key
127.0.0.1:6379> keys *
1) "NAME"
2) "k2"
3) "k1"
4) "name1"
5) "k3"
6) "key1"
#追加数据
127.0.0.1:6379> append k2 "frost"
(integer) 8
127.0.0.1:6379> get k2
"icefrost"
#返回字符串key对应的字节数

set name icefrost
OK
127.0.0.1:6379> strlen name
(integer) 8
#判断key是否存在
127.0.0.1:6379> set name ice ex 5
OK
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name
(integer) 0
#查看key的过期时间
127.0.0.1:6379> ttl ice
   #返回值如果是-2,则表示没有此key
(integer) -2
127.0.0.1:6379> set ice frost ex 10
  
OK
127.0.0.1:6379> ttl ice
  #返回存在的生命周期
(integer) 6
127.0.0.1:6379> ttl ice
  
(integer) -2
127.0.0.1:6379> ttl k1
  默认创建的key是不会过期的
(integer) -1
#重新设置key的过期时间
127.0.0.1:6379> set ice frost ex 10
OK
127.0.0.1:6379> expire ice 30
(integer) 1
127.0.0.1:6379> ttl ice
(integer) 21
#取消key的过期时间
127.0.0.1:6379> set ice frost ex 10
OK
127.0.0.1:6379> persist ice
(integer) 1
127.0.0.1:6379> ttl ice
(integer) -1
#数值递增和递减
127.0.0.1:6379> set num 5
OK
127.0.0.1:6379> incr num
(integer) 6
127.0.0.1:6379> get num
"6"
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> get num
"5"
#数值的增加和减少
127.0.0.1:6379> get num
"5"
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> get num
"7"
127.0.0.1:6379> incrby num -2
(integer) 5

2.list

列表是一种双向的读写管道,左侧是头部,右侧是尾部,一个列表最多可以包含2^32-1个元素。下标从0开始,规则同python的列表下标。

列表具有有序,可重复,左右都可以操作

常见的命令

#lpush插入列表
127.0.0.1:6379> lpush name ice frost cold
(integer) 3
127.0.0.1:6379> type name
list
127.0.0.1:6379> LRANGE name 0 -1
1) "cold"
2) "frost"
3) "ice"
#rpush插入列表
127.0.0.1:6379> rpush lname ice frost cold
(integer) 3
127.0.0.1:6379> LRANGE lname 0 -1
1) "ice"
2) "frost"
3) "cold"
#列表左,右追加数据
127.0.0.1:6379> lpush name abc
(integer) 4
127.0.0.1:6379> rpush name def
(integer) 5
127.0.0.1:6379> LRANGE name 0 -1
1) "abc"
2) "cold"
3) "frost"
4) "ice"
5) "def"
#获取列表指定的位置数据
127.0.0.1:6379> LRANGE name 0 -1
1) "abc"
2) "cold"
3) "frost"
4) "ice"
5) "def"
127.0.0.1:6379> lindex name 2
"frost"
127.0.0.1:6379> lindex name -2
"ice"
#修改指定索引的值
127.0.0.1:6379> LRANGE name 0 -1
1) "abc"
2) "cold"
3) "frost"
4) "ice"
5) "def"
127.0.0.1:6379> lset name 2 icefrost
OK
127.0.0.1:6379> LRANGE name 0 -1
1) "abc"
2) "cold"
3) "icefrost"
4) "ice"
5) "def"
#移除元素
127.0.0.1:6379> LRANGE name 0 -1
1) "abc"
2) "cold"
3) "icefrost"
4) "ice"
5) "def"
127.0.0.1:6379> lpop name
"abc"
127.0.0.1:6379> rpop name
"def"
127.0.0.1:6379> LRANGE name 0 -1
1) "cold"
2) "icefrost"
3) "ice"
#截取元素
127.0.0.1:6379> ltrim name 1 2
OK
127.0.0.1:6379> LRANGE name 0 -1
1) "icefrost"
2) "ice"
#删除列表
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> exists name
(integer) 0

3.集合

集合是String类型的无序集合,集合中的元素是唯一的。

集合的特点无序,无重复,集合间可操作。

常用的命令

#生成一个集合
127.0.0.1:6379> sadd name ice
(integer) 1
127.0.0.1:6379> type name
set
#追加数据,追加只能追加不存在的数据
127.0.0.1:6379> sadd name frost
(integer) 1
127.0.0.1:6379> smembers name
1) "ice"
2) "frost"
#删除集合中的元素
127.0.0.1:6379> srem name ice
(integer) 1
127.0.0.1:6379> smembers name
1) "frost"
#集合运算,交集,并集,差集
#交集
127.0.0.1:6379> smembers name
1) "frost"
127.0.0.1:6379> smembers name1
1) "ice"
2) "frost"
127.0.0.1:6379> sinter name name1
1) "frost"
#集合的并集
127.0.0.1:6379> smembers name2
1) "icefrost"
127.0.0.1:6379> sunion name1 name2
1) "icefrost"
2) "ice"
3) "frost"
#集合的差集
127.0.0.1:6379> sdiff name1 name2
1) "ice"
2) "frost"

4.有序集合

redis有序集合和集合一样都是string类型元素的集合,并且都是不允许重复的成员。区别在于,有序集合会关联一个double类型的分数,redis通过这个分数来进行从小到大的排序,有序集合的成员唯一存在,但是他的分数是可以重复的。集合是通过哈希表实现,所以添加和删除的复杂度都是O(1),集合中的最大成员为2^32-1。

有序集合的特点有序,不重复,每个元素都有score和value,score可以重复,value不可以重复。

常见的命令

#创建一个有序集合
127.0.0.1:6379> zadd name 1 ice
(integer) 1
127.0.0.1:6379> zadd name 2 frost
(integer) 1
127.0.0.1:6379> zadd name 2 cold
(integer) 1
#一次创建多个数据
127.0.0.1:6379> zadd name 1 ice 2 frost 2 cold 3 icefrost
(integer) 4
127.0.0.1:6379> zrange name 0 -1
  #正序排序查看
1) "ice"
2) "cold"
3) "frost"
4) "icefrost"
127.0.0.1:6379> zrevrange name 0 -1
  #倒叙排序查看
1) "icefrost"
2) "frost"
3) "cold"
4) "ice"
#正序显示指定集合内的所有key和数值
127.0.0.1:6379> zrange name 0 -1 withscores
1) "ice"
2) "1"
3) "cold"
4) "2"
5) "frost"
6) "2"
7) "icefrost"
8) "3"
#获取集合内的元素个数
127.0.0.1:6379> zcard name
(integer) 4
#返回某个key的排名
127.0.0.1:6379> zrank name cold
(integer) 1
#返回某个key的分数
127.0.0.1:6379> zscore name cold
"2"
#删除指定的key
127.0.0.1:6379> zrange name 0 -1
1) "ice"
2) "cold"
3) "frost"
4) "icefrost"
127.0.0.1:6379> zrem name ice cold
(integer) 2
127.0.0.1:6379> zrange name 0 -1
1) "frost"
2) "icefrost"

5.哈希、

hash是一个string类型的字段和值的映射表,redis每个hash都可以存储2^32-1键值对,hash适合于存储对象的场景。

常见的命令

#生成并添加字段
127.0.0.1:6379> hset std name ice age 18
(integer) 2
127.0.0.1:6379> hgetall std
1) "name"
2) "ice"
3) "age"
4) "18"
127.0.0.1:6379> hset std gender man
(integer) 1
127.0.0.1:6379> hgetall std
1) "name"
2) "ice"
3) "age"
4) "18"
5) "gender"
6) "man"
#获取字段
127.0.0.1:6379> hgetall std
1) "name"
2) "ice"
3) "age"
4) "18"
5) "gender"
6) "man"
127.0.0.1:6379> hget std name
"ice"
127.0.0.1:6379> hmget std age gender
1) "18"
2) "man"
#删除hash key的字段
127.0.0.1:6379> hdel std gender
(integer) 1
127.0.0.1:6379> hgetall std
1) "name"
2) "ice"
3) "age"
4) "18"
#获取指定的字段的value
127.0.0.1:6379> hmget std age
1) "18"
#获取所有字段名
127.0.0.1:6379> hkeys std
1) "name"
2) "age"
#获取所有的value
127.0.0.1:6379> hvals std
1) "ice"
2) "18"
#删除hash
127.0.0.1:6379> hset std name ice age 18 gender man
(integer) 3
127.0.0.1:6379> del std
(integer) 1
127.0.0.1:6379> exists std
(integer) 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值