Redis基础知识(一)(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis基础知识(一)

Redis简介


Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。


它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),列表(list),集合(sets)和 有序集合(sorted sets)等类型。


Redis安装


$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make


以后台方式启动Redis


修改Redis.conf文件


将daemonize no


修改为

daemonize yes


启动Redis


src/redis-server redis.conf


640.png


开机启动Redis


执行安装脚本,一直默认就可以


./utils/install_server.sh


640.png


mv /etc/init.d/redis_6379 /etc/init.d/redis


设置Redis密码


vim /etc/redis/6379.conf
requirepass redispass
service redis restart


再次连接发现需要输入密码


640.png


Redis命令


全局命令


获取键


keys pattern


keys还支持通配符


127.0.0.1:6379> set we "hello"
OK
127.0.0.1:6379> keys *
1) "we"
127.0.0.1:6379> set name wanger
OK
127.0.0.1:6379> keys name
1) "name"
127.0.0.1:6379> keys *
1) "name"
2) "we"


keys 命令遍历了Redis中所有的键,当键的数量过多时会影响Redis性能


删除键


del key1 key2 ..


例如:


127.0.0.1:6379> keys *
1) "qwe"
2) "asd"
3) "we"
127.0.0.1:6379> del asd qwe
(integer) 2
127.0.0.1:6379> keys *
1) "we"


判断键是否存在


exists key1 key2


例如:


127.0.0.1:6379> exists we
(integer) 1
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> set qwe 2
OK
127.0.0.1:6379> exists we qwe
(integer) 2
127.0.0.1:6379> exists we name
(integer) 1


获取键的总数


dbsize


例如:


127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> keys *
1) "qwe"
2) "we"


获取键的数据类型


type key


例如:


127.0.0.1:6379> type we
string
127.0.0.1:6379> lpush list1 1 2 3
(integer) 3
127.0.0.1:6379> type list1
list


对列表、集合、有序集合的元素进行排序


sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]


例如:


127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "7"
3) "2"
4) "4"
5) "3"
6) "1"
sort list desc limit 0 5 
1) "7"
2) "5"
3) "4"
4) "4"
5) "3"
127.0.0.1:6379> lpush list2 asd qwe zxc
(integer) 3
sort list2 desc limit 0 5 alpha
1) "zxc"
2) "qwe"
3) "asd"


清空数据库


flushdb  //清空当前数据库
flushall  //清空所有数据库


例如:


127.0.0.1:6379[11]> set a 1
OK
127.0.0.1:6379[11]> get a 
"1"
127.0.0.1:6379[11]> flushdb
OK
127.0.0.1:6379[11]> get a 
(nil)


将指定的键移动到其他数据库


move key db


例如:


127.0.0.1:6379[11]> set a 1
OK
127.0.0.1:6379[11]> move a 2
(integer) 1
127.0.0.1:6379[11]> select 2
OK
127.0.0.1:6379[2]> get a
"1"


字符串


字符串类型是Redis最基础的数据结构,字符串类型是其他几种数据类型的基础,他能存储任何形式的字符串,包括二进制数据


设值取值


set key value [EX seconds] [PX milliseconds] [NX|XX]
get key


  • nx:
    键必须不存在,才可以设置成功,用于添加。
  • xx:
    与nx相反,键必须存在,才可以设置成功,用于更新


例如:


127.0.0.1:6379> set name wanger
OK
127.0.0.1:6379> get name
"wanger"
127.0.0.1:6379> setnx name wanger 
(integer) 0
127.0.0.1:6379> set name wang xx
OK


批量设值取值


mset key1 value1 key2 value2 ..
mget key1 key2


例如:


127.0.0.1:6379> mset key1 1 key2 2
OK
127.0.0.1:6379> mget key1 key2
1) "1"
2) "2"


对键值自增自减


incr key
decr key


例如:


127.0.0.1:6379> incr key1
(integer) 2
127.0.0.1:6379> incr key2
(integer) 3
127.0.0.1:6379> get key1
"2"
127.0.0.1:6379> get key2
"3"
127.0.0.1:6379> get we
"hello"
127.0.0.1:6379> incr we
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr key1
(integer) 1
127.0.0.1:6379> decr key2
(integer) 2


追加值


append key value


例如:


127.0.0.1:6379> append key hello
(integer) 5
127.0.0.1:6379> append key world
(integer) 10
127.0.0.1:6379> get key
"helloworld"


获取字符串长度


strlen key


例如:


127.0.0.1:6379> get key
"helloworld"
127.0.0.1:6379> strlen key
(integer) 10
127.0.0.1:6379> set name "王二"
OK
127.0.0.1:6379> strlen name
(integer) 6


设置和获取指定位置的字符串


setrange key offset value
getrange key start end


例如:


127.0.0.1:6379> SET key1 "Hello World"
OK
127.0.0.1:6379> setrange key1 6 "Redis"
(integer) 11
127.0.0.1:6379> get key1
"Hello Redis"
127.0.0.1:6379> getrange key1 6 12
"Redis"


字符串对象编码


字符串类型的内部编码有3种:


  • int:
    8个字节的长整型。
  • embstr:
    小于等于39个字节的字符串。
  • raw:
    大于39个字节的字符串。


例如:


127.0.0.1:6379> set num 123456
OK
127.0.0.1:6379> object encoding num
"int"
127.0.0.1:6379> set short qweasd
OK
127.0.0.1:6379> object encoding short
"embstr"
127.0.0.1:6379> set raw "when you love me I have lost of plot wow wow"
OK
127.0.0.1:6379> object encoding raw
"raw"


列表


Redis列表可以存储一个有序的字符串列表,内部使用双向链表实现,双向链表作为一种常见的数据结构,双向链表的每个数据节点都有两个指针,分别指向后继与前驱节点,从双向链表中的任意一个节点开始都可以很方便地访问其前驱与后继节点,因此获取越接近两端的元素就越快


从左右两边插入元素或者从某一个元素前后插入数据


lpush key value1 value2 value3
rpush key value1 value2 value3
linsert key BEFORE|AFTER pivot value


例如:


127.0.0.1:6379> lpush names 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange names 0 4
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> rpush nums 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange nums 0 4
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> linsert nums before 2 5
(integer) 5
127.0.0.1:6379> lrange nums 0 5
1) "1"
2) "5"
3) "2"
4) "3"
5) "4"


从列表两端删除元素


lpop key
rpop key


例如:


127.0.0.1:6379> lrange nums 0 5
1) "1"
2) "5"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379> lpop nums
"1"
127.0.0.1:6379> rpop nums
"4"
127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "2"
3) "3"


获取给定位置上的元素


lindex key index


例如:


127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "2"
3) "3"
127.0.0.1:6379> lindex nums 2
"3"
127.0.0.1:6379> lindex nums 1
"2"
127.0.0.1:6379> lindex nums -1
"3"


获取给定范围的元素


lrange key start stop


例如:


127.0.0.1:6379> lrange nums 0 1
1) "5"
2) "2"
127.0.0.1:6379> lrange nums 0 2
1) "5"
2) "2"
3) "3"


获取列表长度


llen key


例如:


127.0.0.1:6379> lrange nums 0 3
1) "5"
2) "2"
3) "3"
127.0.0.1:6379> llen nums
(integer) 3


从列表中删除值


lrem key count value


  • count > 0:
    删除数量为count的从头到尾移动的值为value的元素。
  • count < 0:
    删除数量为count的从尾到头移动的值为value的元素。
  • count = 0:
    删除所有等于value的元素。


例如:


127.0.0.1:6379> lrange mylist 0 10
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "2"
 7) "3"
 8) "4"
 9) "5"
10) "5"
127.0.0.1:6379> lrem mylist 1 5
(integer) 1
127.0.0.1:6379> lrange mylist 0 10
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "2"
 6) "3"
 7) "4"
 8) "5"
 9) "5"
127.0.0.1:6379> lrem mylist -2 5
(integer) 2
127.0.0.1:6379> lrange mylist 0 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "2"
6) "3"
7) "4"
127.0.0.1:6379> lrem mylist 0 2
(integer) 2
127.0.0.1:6379> lrange mylist 0 11
1) "1"
2) "3"
3) "4"
4) "3"
5) "4"


修改指定索引的元素


lset key index value


例如:


127.0.0.1:6379> lrange mylist 0 6
1) "1"
2) "3"
3) "4"
4) "3"
5) "4"
127.0.0.1:6379> lset mylist 1 5
OK
127.0.0.1:6379> lrange mylist 0 6
1) "1"
2) "5"
3) "4"
4) "3"
5) "4"


阻塞操作


blpop和brpop分别是lpop和rpop的阻塞版本,功能类似,当列表为空时,会发生阻塞,timeout可定义阻塞时间,timeout为0时将一直阻塞,直到在另一个客户端中往列表中加入元素


blpop key1 key2 timeout
brpop key1 key2 timeout


例如:


127.0.0.1:6379> lrange list2 0 4
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lrange list1 0 4
1) "8"
2) "7"
127.0.0.1:6379> blpop list1 list2 0
1) "list1"
2) "8"
127.0.0.1:6379> brpop list1 list2 0
1) "list1"
2) "7"
127.0.0.1:6379> brpop list1 list2 0
1) "list2"
2) "2"
127.0.0.1:6379> brpop list1 list2 0
1) "list2"
2) "3"
127.0.0.1:6379> brpop list1 list2 0
1) "list2"
2) "4"
127.0.0.1:6379> brpop list1 list2 0
1) "list2"
2) "1"
(18.49s)
在另一个客户端执行
127.0.0.1:6379> lpush list2 1
(integer) 1


列表内部编码


  • ziplist(压缩列表):
    列表元素保存的所有字符串元素的长度都小于64字节且元素数量小于512个时使用ziplist编码
  • linkedlist(链表):
    当列表类型无法满足两个条件的任意一个的时候,redis会使用linkedlist作为列表的内部实现
  • quicklist:
    list的内部实现quicklist是一个ziplist的双向链表,双向链表是由多个节点(Node)组成的,quicklist的每个节点都是一个ziplist。


参考张铁蕾http://zhangtielei.com/posts/blog-redis-quicklist.html

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
存储 缓存 NoSQL
Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化
Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化
|
7月前
|
存储 缓存 NoSQL
Redis 基础知识和核心概念解析:理解 Redis 的键值操作和过期策略
Redis 基础知识和核心概念解析:理解 Redis 的键值操作和过期策略
76 1
|
7月前
|
存储 缓存 NoSQL
Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式
Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式
91 0
|
8月前
|
存储 缓存 NoSQL
【Redis从头学-14】一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程
【Redis从头学-14】一文带你学会Redis Cluster集群模式、数据分片基础知识以及三主三从结构分片集群搭建全过程
81 0
|
11月前
|
存储 NoSQL API
【Redis基础知识 十】Redis底层数据编码之压缩列表
【Redis基础知识 十】Redis底层数据编码之压缩列表
68 0
|
11月前
|
NoSQL 安全 API
【Redis基础知识 九】Redis底层数据编码之整数集合
【Redis基础知识 九】Redis底层数据编码之整数集合
55 0
|
11月前
|
存储 NoSQL API
【Redis基础知识 八】Redis底层数据编码之跳跃表
【Redis基础知识 八】Redis底层数据编码之跳跃表
66 0
|
11月前
|
NoSQL 算法 Serverless
【Redis基础知识 七】Redis底层数据编码之字典
【Redis基础知识 七】Redis底层数据编码之字典
59 0
|
11月前
|
缓存 NoSQL API
【Redis基础知识 六】Redis底层数据编码之链表
【Redis基础知识 六】Redis底层数据编码之链表
37 0
【Redis基础知识 六】Redis底层数据编码之链表
|
11月前
|
存储 NoSQL 安全
【Redis基础知识 五】Redis底层数据编码之动态字符串
【Redis基础知识 五】Redis底层数据编码之动态字符串
68 0