Redis基础语法

1.什么是nosql?
NoSQL,指的是非关系型的数据库,NoSQL用于超大规模数据的存储。
2.为什么使用NoSQL ?
Nosql类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展
3.Nosql简史
Nosql1998年是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
4.Nosql的优点:
高可扩展性
分布式计算
低成本
架构的灵活性,半结构化数据
没有复杂的关系
5.Nosql的缺点:
没有标准化
有限的查询功能(到目前为止)
最终一致是不直观的程序
6.Nosql数据库的分类:
列存储、文档存储、key-value存储、图存储、对象存储、xml数据库存储
7.RDBMS vs NoSQL
RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL) (SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务
    NoSQL
  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
    -键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性
    Redis
    1.什么是redis?
    Redis是完全开源免费的,用c语言编写的,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持
    持久化的Nosql数据库,是当前最热门的nosql数据库之一,也被称为数据结构服务器。
    2.Redis的特点:
    支持存储的value类型相对更多
    Redis支持各种不同方式的排序
    为了保证效率,数据都是缓存在内存中
    Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,
    并且在此基础上实现了master-slave(主从)同步
    (1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用
    (2)Redis不仅仅支持检点的key-value类型的数据,同时提供了list,set,zset,hash等数据结构的存储
    (3)Redis支持数据的备份,即master-slave模式的数据备份
    3.Redis应用场景
    (1)配合关系型数据库做高速的缓存
    高频次,热门访问的数据,降低数据库IO
    分布式架构,做session共享
    4.Redis端口
    6379
    Redis有16个数据库
    切换数据库:
    select 数据库号(0…15)
    eg:
    select 1
    select 2
    5.Redis的数据类型: key :value
    string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型);
    (1)String字符串类型:
    是redis最基本的数据类型,一个key对应一个value,是二进制安全的,最大能存储的值是512MB;
    (2)Hash(哈希)
    是key=>value键值对集合,适合用于存储对象存储一些结构化的数据;
    应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。
    (3)List(列表)
    是简单的字符串列表,按照插入顺序排序,经常会被用于消息队列的服务,以完成多程序之间的消息交换;
    (4)Set(集合)
    Set是string类型的无序集合,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的
    优势在于可以进行交集并集差集操作,最大元素数量是4294967295,是通过哈希表实现的。
    应用场景:
    1、利用交集求共同好友。
    2、利用唯一性,可以统计访问网站的所有独立IP。
    3、好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
    (5)zset(有序集合)
    String类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,通过分数来为集合中的成员进行从小到大的排序,
    成员是唯一的,分数却可以重复,用于有序的并且不重复的集合列表的需求。
    应用举例:
    (1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
    (2)排行榜应用,根据得分列出topN的用户等。
    Key的常用操作:
    添加键值对
    set
    eg:
    给数据库里面添加一个key为a ,value为1的数据
    set a 1
    (1)查询当前库的所有键
    keys *
    (2)判断某个键是否存在(如果存在返回1,如果不存在返回0)
    exists
    eg:
    查看key名为a的键是否存在
    exists a
    查看key名为d的键是否存在
    exists d
    (3)查看键对应的数据的类型
    type
    eg:
    查看名为a的key对应的数据的类型
    type a
    (4)删除某个键
    del
    eg:
    删除名为a1的key
    del a1
    练习:
    (1)切换到数据库8
    (2)添加以下数据
    key value
    a 1
    b 2
    c 3
    (3)查看当前数据库中所有的键
    (4)分别查看 a b c 对应的数据的类型
    (5)查看名为p的键是否存在
    (6)分别查看名为 a b c的键是否存在
    (7)分别删除名为 a b c 的键
    (5)为键值设置过期时间,单位是秒
    expire <时间>
    eg:
    将名为a的key设值20秒过期时间
    expire a 20
    (6)查看还有多少秒过期,-1表示永不过期,-2表示已经过期
    ttl
    eg:
    查看名为a的key还有多少秒过期
    ttl a
    练习:
    (1)添加以下数据
    key value
    a 1
    b 2
    c 3
    (2)将名为a的key设值20秒过期时间,并查询其过期过程
    (3)将名为b的key设值30秒过期时间,并查询其过期过程
    (4)将名为c的key设值40秒过期时间,并查询其过期过程
    (7)查看当前数据库的key的数量
    dbsize
    (8)清空当前库
    flushdb
    (9)通杀全部库
    Flushall
    String类型相关命令
    (1)添加键值对
    set
    eg:
    添加一个key为 a ,value为1的数据
    set a 1
    (2)查询对应的键值
    get
    eg:
    查询名为a的键对应的数值
    get a
    练习:
    (1)添加以下数据
    key value
    a1 1
    b1 2
    (2)查询a1 b1对应的值

(3)将给定的值追加到原值的末尾
append
eg:
将good追加到key名为a的末尾
append a good
练习:
(1)创建一个名为a 值为123的键值对
(2)给123的后面追加abc
(4)获取值的长度
strlen
eg:
获取名为a的key中数据的长度
strlen a
(5)只有在key不存在时设置key的值
setnx
如果key是存在的则不设置(返回0),如果不存在则新增(返回1)
(6)将 key 中储存的数字值加减1
只能对数字值操作,如果为空,新增值为1
incr 对key的值进行加1的操作
decr 对key的值进行减1的操作
练习:
(1) key value
t1 1234
t2 abcd 将以上数据进行字符串的添加操作
(2)获取t2的长度
(3)添加key为p值为123的数据,如果p存在就不设置
(4)对t1进行加1减1的操作
(7)将key中存储的数字值增减(自定义加减数)
<1>incrby <需要增加的数量>
eg:
创建一个名为r值为10的数据,然后对r的值再加10
set r 10
incrby r 10
<2>decrby <需要减的数量>
eg:
创建一个名为r值为30的数据,然后对r的值再减5
set r 30
decrby r 5
练习:
(1)
key value
t3 100
t4 20 将以上数据添加到数据库中
(2)获取t3的长度
(3) 给t3的值加100
(4)给t4的值减15
(5)给t3的值追加good
(6)创建一个key为u值为9的数据,如果存在则不创建,不存在则创建
(7)获取t3 和t4的值
(8)同时设置一个或多个key-value对
mset
eg:
key value
t3 100
t4 20 将以上数据同时添加到数据库中

mset t3 100 t4 20

student
小红 100
小白 98
小黑 59
mset 小红 100 小白 98 小黑 59
(9)同时获取一个或者多个value值
mget …
eg:
小红 100 小白 98 小黑 59
获取成绩单中所有人的分数
mget 小红 小白 小黑
练习:
(1)aa 100
bb 98
cc 59将以上成绩单数据同时添加到数据库中
(2)获取成绩单中所有的分数
(10)同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
msetnx
(11)获取值的范围
getrange <起始位置><结束位置>
eg:
s1 qggduede将以上数据添加到数据库中,并且获取qgg
getrange s1 0 2
(12)用 覆写 所储存的字符串值,从<起始位置>开始覆盖
setrange <起始位置>
将原数据值得部分内容替换成新的内容
eg:
s2 uuuuuu将前3个u替换为999
set s2 uuuuuu
setrange s2 0 999
(13)设置键值的同时,设置过期时间,单位秒
setex <过期时间>
eg:
s3 rrty将以上数据添加到数据库中,并同时设置过期时间为30秒
setex s3 30 rrty
(14)以新换旧,设置了新值同时获得旧值
设置新值同时获得旧值
getset
eg:
s4 uxop 将以上数据添加到数据库中
set s4 uxop
然后获s4的值的同时将值替换为oooo
getset s4 0000
练习:
(1)
d1 80
d2 90
d3 ertyui 将以上数据同时添加到数据库中
(2)同时获取所有的分数
(3)获取d3中的tyu
(4)将d3的ert部分替换为kkk
(5)d5 ukp将以上数据添加到数据库中并同时设置过期时间为30秒
(6)获取d3值的同时将其值更改为good
List
单键多值(一个键有多个值)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
(1)从左边/右边插入一个或多个值
lpush/rpush …
eg1:
从左边插入一个key为t 值为 a b c d 的数
set t a
set t b
lpush t a b c d
1 2 3 4 5
54321
eg2:
从右边插入一个key为t 值为 a b c d 的数
rpush t a b c d
(2)从左边/右边吐出一个值
lpop ----->左边
rpop ------>右边
eg:
插入一个键名为a值为1 2 3 4 5和键名为b值为a b c d e的数据
<1>当数据从左边插入时:
a输入的数据为:12345
a数据的存储状态:54321 -------------->lpush a 1 2 3 4 5
b输入的数据为:a b c d e
b数据存储额状态为:edcba
从左边吐出a的数据:--------------------->lpop a
5
从右边吐出a的数据:---------------------->rpop a
1
从左边吐出b的数据:--------------------->lpop b
e
从右边吐出b的数据:---------------------->rpop b
a
从a的右边吐出1个值,插到b列表的左边
1 e
结果为:1edcba
<2>当数据从右边边插入时:
a输入的数据为:12345
a数据的存储状态:12345 -------------->rpush a 1 2 3 4 5
b输入的数据为:a b c d e
b数据存储额状态为:abcde
从左边吐出a的数据:--------------------->lpop a
1
从右边吐出a的数据:---------------------->rpop a
5
从左边吐出b的数据:--------------------->lpop b
a
从右边吐出b的数据:---------------------->rpop b
e
从a的右边吐出1个值,插到b列表的左边
5 a
结果为:5abcde
(3)从列表右边吐出一个值,插到列表左边
rpoplpush 从列表1的右边吐出一个值插入到列表2的左边
(4)按照索引下标获得元素(从左到右进行获取)
lrange
eg:
a 1 2 3 4 5将以上数据从左边输入到数据库中,然后获取索引下标0-2的元素
lpush a 1 2 3 4 5
lrange a 0 2
a的存储状态:54321
0-2的结果是:543
(5)按照索引下标获得元素
lindex <索引数>
eg:
b 6 7 8 9将以上数据从左边输入到数据库中,然后获取下标为3的元素
lpush b 6 7 8 9
lindex b 3
b的存储状态:9876
下标为3的数:6
(6)获取列表的长度
llen
eg:
n 1 2 3 4 5将以上数据从左边插入到数据库中,然后获取列表n的长度
lpush n 1 2 3 4 5
llen n
(7)在的前面插入
linsert before
eg:
k1 a b c d e 将以上数据从左插入到数据库中,然后在k1中的b前面插入xiaoqiang
lpush k1 a b c d e
linsert k1 before b xiaoqiang
(8)从左边删除n个value(从左到右)
lrem
eg:
k2 a a a b d 将以上数据从左插入到数据库中,然后从左边删除2个值
lpush k2 a a a b d
lrem k2 2 a
练习:
(1) k1 a b c d将以上数据从左插入到数据库中,然后再从右边吐出第一个数
(2)k2 a b c d 将以上数据从右边插入到数据库中,然后再从左边吐出第一个数
(3)k3 1 2 3 4
k4 a b c d将以上数据从左插入到数据库中,从列表k3的右边吐出一个值插入到列表k4的左边
(4)k5 a b c d 将以上数据从左边输入到数据库中,然后获取索引下标0-2的元素
(5)k6 a b c d 将以上数据从左边插入到数据库中,然后获取列表k6的长度
(6)k7 a b b c d 将以上数据从左插入到数据库中,然后从左边删除2个值
(7)k8 a b c d 将以上数据从左边输入到数据库中,然后获取下标为3的元素
(8)k9 1 2 3 4
k10 a b c d将以上数据从左插入到数据库中,从列表k9的右边吐出一个值插入到列表k10的左边
(9)k11 a b c d e 将以上数据从左插入到数据库中,然后在k11中的b前面插入xiaoming
(10)k12 a a a b d 将以上数据从左插入到数据库中,然后从左边删除2个值
Set
无序集合
(1)将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。(添加一键多值)
sadd …
eg:
1 2 3 4 5 将以上的数据添加到集合a中,然后再给集合a中存入一个5
sadd a 1 2 3 4 5
sadd a 5
(2)取出该集合中的所有值
smembers
eg:
查看key名为a的集合里面的所有值
smembers a
(3)判断集合是否为含有该值,有返回1,没有返回0
sismember
eg:
a b c d 将以上的数据添加到集合v中,然后判断集合v是否含有c元素
sadd v a b c d
sismember v c
(4)返回集合中的元素个数
scard
eg:
h j k p将以上数据添加到集合v1中,然后获取出集合v1中的元素个数
sadd v1 h j k p
scard v1
(5)删除集合中的某个元素
srem …
eg:
k p n 将以上数据添加到集合v2中,然后删除集合v2中的p
sadd v2 k p n
srem v2 p
(6)随机从该集合中吐出一个或多个值。(原来的值会被删除)
spop
eg:
48 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 44 45 19
将以上数据添加到集合v3中,然后随机抽取一个数
spop v3 1
(7)随机从该集合中取出n个值。
不会从集合中删除
srandmember
eg:
48 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 44 45 19
将以上数据添加到集合v3中,然后随机抽取一个数
srandmember v3 1
(8)返回两个集合的交集元素
sinter
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的交集
sadd v4 1 2 3 4 5
sadd v5 6 7 8 4 5
sinter v4 v5
(9)返回两个集合的并集元素
sunion
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的并集
sadd v4 1 2 3 4 5
sadd v5 6 7 8 4 5
sunion v4 v5
(10) 返回两个集合的差集元素
sdiff
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的差集
sdiff v4 v5
练习:
(1)s s s d f将以上数据插入到集合m1中,然后取出该集合中的所有值
(2) d f g h 将以上数据插入到集合m2中,然后判断在集合m2中是否存在p
(3)j k v b c 将以上数据插入到集合m3中,然后获取m3中的元素个数
(4)k o p d g 将以上数据插入到集合m4中,然后删除集合中的元素d
(5)p k g h k 将以上数据插入到集合m5中,然后随机吐出2个值,要求吐出的值被删除掉
(6) k g b c x 将以上数据插入到集合m6中,然后随机吐出3个值,要求吐出的值任被保留
(7) 1 2 3 4 6
9 0 4 6 7 将以上数据分别添加到m7和m7plus中,然后获取m7和m7plus的并集
(8) 1 1 2 3 6
8 9 2 4 1 将以上数据分别添加到m8和m8plus中,然后获取m8和m8plus的交集
(9) 1 6 2 6 6
8 6 2 4 5 将以上数据分别添加到m9和m9plus中,然后获取m9和m9plus的交集
zset
有序集合
(1)将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zadd …
eg:
小红 90
小白 80
小黑 100 将以上数据存在一个key为name1的有集合中
zadd name1 90 小红 80 小白 100 小黑
(2)返回有序集 key 中,下标在 之间的元素 (如果要同时查看score 在命令后面加 withscores)
zrange (withscores)
eg:
小红 90
小白 80
小黑 100 将以上数据存在一个key为name2的有集合中,然后返回集合中的所有元素
zadd name2 90 小红 80 小白 100 小黑
zrange name2 0 10
(3)返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrangebyscore key min max (从小到大排序)
eg:
a 90
b 80
c 100 将以上数据存在一个key为name3的有集合中,然后按从小到大排序
zrangebyscore name3 80 90
(4)从大到小排序
zrevrangebyscore key max min (从大到小排序)
eg:
a 90
b 80
c 100 将以上数据存在一个key为name3的有集合中,然后按从大到小排序
zrevrangebyscore name3 100 80
(5)为元素的score加上增量
为元素原来的分数加一些分
zincrby <添加的分数>
eg:
a 10
b 20
c 30 将以上数据存在一个key为name4的有集合中,然后给c加10分
zadd name4 10 a 20 b 30 c
zincrby name4 10 c
(6)删除该集合下,指定值的元素
zrem
eg:
小刘 90
小马 80
小张 60将以上数据存在一个key为name5的有集合中,然后删除小张
zadd name5 90 小刘 80 小马 60 小张
zrem name5 小张
(7)统计该集合,分数区间内的元素个数
zcount
eg:
小刘 90
小马 67
小张 60
小葵 70 将以上数据存在一个key为name6的有集合中,统计分数在60和70之间的人数
zadd name6 90 小刘 67 小马 60 小张 70 小葵
zcount name6 60 70
(8)返回该值在集合中的排名,从0开始 0 1 2
zrank
eg:
小刘 90
小马 67
小张 60
小葵 70 将以上数据存在一个key为name7的有集合中,返回小张在班级中排名
zadd name6 90 小刘 67 小马 60 小张 70 小葵
zrank name6 xiaozhang
练习:
1.胡南 100
萍萍 99
娟娟 88将以上数据存在一个key为student1的有集合中,然后返回集合中的所有同学的姓名
2.超超 78
婉如 100
妮妮 98将以上数据存在一个key为student2的有集合中,然后通过分数按从小到大排序
3.将集合student2的数据按从小到大排序
4.超超同学加15分
5.超超 78
婉如 100
妮妮 98
元元 59 将以上数据存在一个key为student3的有集合中,统计分数在50和70之间的人数
6.查询集合student3中婉如同学的名次
7.删除student3中的元元
hash
键值对集合
id
name age sex
小红 18 女
小白 19 男
小黑 20 女

student name 小红
student age 19
student sex 女

hash

id name 小红 age 18 sex 女
(1)给集合中的 键赋值
hset <标签/属性>
eg:
创建一个名为student的集合 ,然后给集合student 加上name 标签并赋值为小红
hset student name 小红
(2)从集合 取出 value
hget
eg:
创建一个名为student的集合 ,然后给集合student 加上name 标签并赋值为小红,然后获取name的值
hset student name 小红
hget student name
(3)批量设置hash的值
hmset …
eg:
name age sex score
小红 18 女 100
key名为student1 将以上数据创建集合并进行相应标签的赋值
hmset student1 name 小红 age 18 sex 女 score 100
(4)查看哈希表 key 中,给定域 field 是否存在。
hexists key
eg:
查看名为student1的集合中是否存在name标签
hexists student1 name
(5)列出该hash集合的所有field
hkeys
eg:
查看名为student1的集合中的所有标签
hkeys studnet1
(6)列出该hash集合的所有value
hvals
eg:
查看名为student1的集合中的所有标签的值
hvals student1
(7)为哈希表 key 中的域 field 的值加上增量 increment
hincrby
eg:
为student1的集合中的age 加10
hincrby student1 age 10
(8)将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
hsetnx
如果field存在就不设置,不存在就新增
eg:
为集合student1中设置属性name 值为 小黑的数据
hsetnx student1 name 小黑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值