新人入坑Redis必会的吐血总结(一)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 新人入坑Redis必会的吐血总结

新人入坑Redis必会的吐血总结

一、什么是Redis

Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NO SQL(不是SQL),它的全称是Not Only SQL(不仅仅是SQL),换个层面来讲,它是一种非关系型的数据库,它是作为关系型数据库的良好补充,它与传统的MySQL,Oracle不同之处在于,它是通过在内存中读写数据,大大提高了读写速度。可以说,Redis是为了解决网站高并发、高可用、高可扩展、大数据存储等一系列问题而产生的数据库解决方案,不可或缺的一部分。

它具有以下特点:

1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2、Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list、set、sortedset、hash等数据结构的存储。

3、Redis支持数据的备份,即master-slave模式的数据备份。

Redis有五种键值类型:

  • String字符类型
  • hash散列类型
  • list列表类型
  • set集合类型
  • sortedset有序集合类型

而本文将基于Redis5.0为例来介绍Redis一些相关命令的使用和踩过的坑

二、关于Redis的安装与启动

环境准备

安装教程请参看这里:https://www.cnblogs.com/ECJTUACM-873284962/p/9532043.html

在线环境

官网似乎提供了一个在线的Redis平台,链接在这里:http://try.redis.io/

Redis启动

前端启动

按照我所提供的教程安装以后,我们只需要输入命令redis-server即可,界面如下:

img_78839acbcee9ce1ece2c2f9a2640ef2e.png

前端停止启动
  • 强制关闭:Ctrl+c
  • 正常关闭[root@sakura]# redis-cli shutdown
后端启动

因为Redis在实际使用中不会只是一个Redis单独工作,启动和关闭方式中的ip地址和端口号可以在配置文件中自行修改,下面会有修改方式.

启动方式

  1. 需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下.直接复制粘贴即可
  2. 修改redis.conf文件,将daemonize改为yes(vi redis.conf进去,:/daemonize搜索).
  3. 使用命令后端启动redis.命令行redis-server redis.conf(以配置文件启动)
  4. 查看是否启动成功.命令行 ps -aux | grep redis (直接查看redis的进程)

如果你之前按照我所提供的教程修改过,这一过程可以直接忽略就好


img_8ab3a6e0fffce5fcdabf225bfe9d5fb7.png


关闭方式

  • 强制关闭:kill -9 PID
  • 正常关闭:redis-cli -h ip地址 -p 端口号(默认端口号是6379) shutdown

在项目中,建议使用正常关闭。 因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

Redis客户端启动

启动客户端命令:[root@sakura]# redis-cli -h ip地址 -p 端口号

由于默认IP是127.0.0.1,端口是6379,我们只需要输入命令redis-cli即可

退出:127.0.0.1:6379> quit即可

三、Redis数据类型及常用命令讲解

1、Redis-String

string使用环境:主要用于保存json格式的字符串

赋值

set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回"OK",如果赋予相同的key,新的value会覆盖老的value

example:

127.0.0.1:6379> set username zhangsan
OK
取值

get key:获取key的value。如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value;如果该key不存在,返回nil

example:

127.0.0.1:6379> get username
"zhangsan"
删除

del key:删除指定key,返回值是数字类型,表示删了几条数据

example:

127.0.0.1:6379> del username
(integer) 1
扩展

getset key value:先获取该key的值,然后再设置该key的值

example:

127.0.0.1:6379> getset username zhangsan
(nil)
127.0.0.1:6379> keys *
1) "username"
127.0.0.1:6379> get username
"zhangsan"

incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后的值为1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于++(作用:统计网站访客人数,当计数器)

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19

decr key:将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在incr之后的值为-1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于--i

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> decr age
(integer) 17

append key value:拼接字符串,如果该key存在,则在原有的value后追加该值,如果该key不存在,则重新创建一个key/value

example:

127.0.0.1:6379> set information hel
OK
127.0.0.1:6379> append information lo
(integer) 5
127.0.0.1:6379> get information
"hello"


incrby和decrby:只能对字符串是数字的进行操作,incrby key value是对原有的key的值增加value,而decrby key value是对原有的key的值减少value

example:

127.0.0.1:6379> get age
"17"
127.0.0.1:6379> incrby age 10
(integer) 27
127.0.0.1:6379> decrby age 10
(integer) 17
127.0.0.1:6379> get information
"hello"
127.0.0.1:6379> incrby information 10
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby information 10
(error) ERR value is not an integer or out of range

2、Redis-hash

Redis中的hash类型可以看成具有string key和string value的map容器,所以该类型非常适合于存储值对象的信息。如username,password和age等。如果hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个hash可以存储4294967295个键值对。

hash特点:占用的磁盘空间极少

赋值:

hset key field value:为指定的key设定field/value对(键值对)

example:

127.0.0.1:6379> hset key1 field1 123
(integer) 1

hmset key field value[field2 value2...]:设置key中的多个field/value

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK
取值:

hget key filed:获取指定的key的field的值

example:

127.0.0.1:6379> hget key1 field1
"123"

hmget key filed1 field2...:获取key中的多个field的值

example:

127.0.0.1:6379> hmget aaa name age
1) "kitty"
2) "20"

hgetall key:获取key中的所有field-value2

example:


127.0.0.1:6379> hgetall aaa
1) "name"
2) "kitty"
3) "age"
4) "20"


删除

hdel key field[field...]:可以删除一个或多个字段,返回值是被删除的字段个数

example:

127.0.0.1:6379> hdel key1 field1
(integer) 1

del key:删除整个list

example:

127.0.0.1:6379> del aaa
(integer) 1
增加数字

hincrby key field increment:设置key中的field增加increment,如age增加20

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK
127.0.0.1:6379> hincrby aaa age 20
(integer) 40
扩展命令

hexists key field:判断指定的key中的field是否存在

example:

127.0.0.1:6379> hexists aaa name
(integer) 1
127.0.0.1:6379> hexists aaa aaaa
(integer) 0


hlen key:获取key所包含的field的数量

example:

127.0.0.1:6379> hlen aaa
(integer) 2

hkeys key:获得所有的字段

example:

127.0.0.1:6379> hkeys aaa
1) "name"
2) "age"

3、Redis-list

Redis中list选取的是链表,因为在Redis操作中,最多的操作是进行元素的增删

赋值

lpush key value [value1 value2 ...] 在指定的key所关联的list头部插入所有的value,如果该key不存在,该命令在插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数。

example:

127.0.0.1:6379> lpush score1 1 2 3 4 5
(integer) 5

rpush key value [value1 value2 ...] 在该list的尾部添加元素

example:

127.0.0.1:6379> rpush score2 1 2 3 4 5
(integer) 5
取值

lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可以为负数,若为-1则表示链表尾部的元素,-2表示倒数第二个,以此类推...

example:

127.0.0.1:6379> lrange score1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrange score2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
删值

lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素

example:

127.0.0.1:6379> lpop score1
"5"
127.0.0.1:6379> lpop score2
"1"

rpop key:从尾部弹出元素

example:

127.0.0.1:6379> rpop score1
"1"
127.0.0.1:6379> rpop score2
"5"
扩展

llen key:返回指定的key关联的链表中的元素的数量

example:

127.0.0.1:6379> llen score1
(integer) 3
127.0.0.1:6379> llen score2
(integer) 3

lrem key count value:删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count个值为value的元素,如果count小于0,则从尾到头遍历并删除,如果count等于0,则删除链表中所有等于value的元素。

example:

127.0.0.1:6379> lrem score1 1 2
(integer) 1
127.0.0.1:6379> lrem score2 1 2
(integer) 1


通过索引替换

lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常

example:

127.0.0.1:6379> lset score1 0 1
OK
127.0.0.1:6379> lset score2 0 1
OK
在索引前/后插入元素

linsert key before|after pivot value:在pivot元素前或者后插入value这个元素

example:

127.0.0.1:6379> linsert score1 before 3 aaa
(integer) 3
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> linsert score1 after 3 bbb
(integer) 4
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
4) "bbb"

rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操作]

example:

127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> lrange score2 0 -1
1) "bbb"
2) "1"
3) "4"
127.0.0.1:6379> rpoplpush score1 score2
"3"
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
127.0.0.1:6379> lrange score2 0 -1
1) "3"
2) "bbb"
3) "1"
4) "4"


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
缓存 监控 NoSQL
Redis高可用总结:Redis主从复制、哨兵集群、脑裂...
在实际的项目中,服务高可用非常重要,如,当Redis作为缓存服务使用时, 缓解数据库的压力,提高数据的访问速度,提高网站的性能 ,但如果使用Redis 是单机模式运行 ,只要一个服务器宕机就不可以提供服务,这样会可能造成服务效率低下,甚至出现其相对应的服务应用不可用。
443 0
Redis高可用总结:Redis主从复制、哨兵集群、脑裂...
|
NoSQL Redis
Redis学习7:按次结算的服务控制、微信会话顺序管理(应用场景总结)
现在数据类型五种基本的已经学完了,现在开始应用一个简单的业务场景。
Redis学习7:按次结算的服务控制、微信会话顺序管理(应用场景总结)
|
存储 NoSQL 安全
新人入坑Redis必会的吐血总结(二)
新人入坑Redis必会的吐血总结(二)
117 0
|
存储 缓存 负载均衡
Redis cluster去中心化设计的思考与总结
Redis cluster去中心化设计的思考与总结
223 0
|
缓存 监控 NoSQL
Redis常见面试题总结
Redis常见面试题总结
Redis常见面试题总结
|
数据采集 分布式计算 NoSQL
爬虫识别-爬虫写入 Redis-效果及总结| 学习笔记
快速学习爬虫识别-爬虫写入 Redis-效果及总结
102 0
爬虫识别-爬虫写入 Redis-效果及总结| 学习笔记
|
消息中间件 缓存 NoSQL
【Java】来总结一下Nosql数据库之Redis基础知识点
作为开发的程序员对Redis都应该不陌生,Redis是一个Key-Value键值对数据库,也是一个nosql数据库。 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 有了它可以帮助我们提高系统性能。
111 0
|
存储 缓存 NoSQL
浅浅总结Redis
Redis作为开源数据库,为开发者提供了多种语言的API。而Redis应用在实际开发中已经很常见了,不仅能作为缓存存储数据,也由于其键值对存储数据的形式而可以作为持久化数据存储。接下来我们浅谈一下Redis的集群和缓存。
100 0
浅浅总结Redis
|
存储 缓存 监控
redis总结万能手册,熟悉不等于精通;
日常总结:redis线程模型,多路复用原理;单体,哨兵架构,集群架构的自动化安装,解释说明,集群扩容,缩容,选举,主从自动切换策略,应用程序接入……
221 0
redis总结万能手册,熟悉不等于精通;
|
存储 缓存 NoSQL