*1.redis介绍*
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。为了实现其卓越的性能, Redis 采用运行在内存中的数据集工作方式. 根据您的使用情况, 您可以每隔一定时间将数据集导出到磁盘, 或者追加到命令日志中。您也可以关闭持久化功能,将Redis作为一个高效的网络的缓存数据功能使用。
*2.redis支持的数据类型*
Redis支持多种类型的数据结构,有 :
字符串(strings:简单的key-value键值对,value仅仅是String,也可以是int类型)
散列(hashes:可看做StringKey与StringValue的map容器)
列表(lists:栈、队列)
集合(sets:集合)
有序集合(sorted sets:有序集合)ZSet
*3.Redis 产品有以下三个特点*
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。 //主从模式
二.**Redis 安装与启动**
*2.1 redis下载与安装*
Redis 没有官方的Windows版本,但是微软开源技术团队(Microsoft Open Tech group)开发和维护着这个 Win64 的版本,可在Releases · microsoftarchive/redis · GitHub下载或redis解压即用:
可以查看一下安装说明:README.md 和 INSTALL
*2.2 redis服务、客户端启动*
c/s :client/server B/S : broswer server
DOS命令进入安装主目录,启动redis服务:
redis-server.exe #使用默认配置启动redis服务
redis-server.ext redis.conf #或者指定配置文件启动redis服务
启动客户端连接:
redis-cli #使用默认配置连接服务器
redis-cli -h 127.0.0.1 -p 6379 #或者指定服务器IP连接redis服务 host port
查看客户端是否连接成功:
> ping
PONG
注:出现PONG,则连接成功!
*2.3 redis服务关闭*
关闭服务:
①客户端命令窗口关闭:redis-cli -h 127.0.0.1 -p 6379 shutdown
注:若配置安全认证需添加密码,如:
edis-cli -h 127.0.0.1 -p 6379 -a pwd shutdown
②服务端口窗口:CTRL+C
③强制杀死进程
#
windows命令行下redis读取中文字符乱码
原创落xiao昶 发布于2018-08-04 14:32:26 阅读数 5512 收藏
展开
我在eclipse上对redis进行了一个操作,添加了一个中文字符串进去,可以看到是添加成功了的
但是在命令行中读取的时候却成了乱码,如下图所示
这是因为windows命令行的编码是gbk
可以通过如下方法解决:
启动命令行,输入chcp 65001(是utf-8格式),我们可以看到命令行的属性当中多了一种字体,选择它!(当然这里也是可以选择其他字体的了,不过字体格式也得改呢,就有待各位自己去look咯~~)
再输入命令redis-cli --raw启动客户端,查找userName的值,可以看见是中文的了~
三.**五种基本类型操作**
*3.1 string 操作*
String举例: test
添加/修改一个 string:
127.0.0.1:6379> set test 123
重新赋值:
127.0.0.1:6379>set test 456
查询一个string:
127.0.0.1:6379>get test
append追加一个string:
127.0.0.1:6379> append test 456
注:(integer) 6(返回字符串的长度)
删除一个key:
127.0.0.1:6379>del test
返回字符串长度
127.0.0.1:6379>strlen test
*3.2 hash 操作*
hash是一个string类型的field和value的映射表,可以看做是一个Map表结构容器。 hashMap<String,String>
添加一个 hash:
127.0.0.1:6379> HMSET hashtest name xiaoming age 12
返回整个 hash:
127.0.0.1:6379> HGETALL hashtest
1) "name"
2) "xiaoming"
3) "age"
4) "12"
返回hash中的一个字段:
127.0.0.1:6379> hget hashtest name
"xiaoming"
返回hash中的多个个字段:
127.0.0.1:6379> HMGET hashtest name age
1) "xiaoming"
2) "12"
删除一个hash中的字段:
127.0.0.1:6379> HDEL hashtest age
127.0.0.1:6379> HGETALL hashtest
1) "name"
2) "xiaoming"
添加/修改hash中的字段:
127.0.0.1:6379> HSET hashtest name xiaoxin
(integer) 0
127.0.0.1:6379> HGETALL hashtest
1) "name"
2) "xiaoxin"
查看指定键是否存在:
127.0.0.1:6379> HEXISTS hashtest age
(integer) 0
注:返回整数1或0。
1表示哈希包含该字段。
0 表示哈希不包含该字段,或key不存在。
补:
查看所有存在的键:
127.0.0.1:6379> KEYS *
清空所有数据库数据:
127.0.0.1:6379> FLUSHALL
清空当前数据库数据:
127.0.0.1:6379> FLUSHDB
*3.3 list操作*
添加元素到列表头:
127.0.0.1:6379> LPUSH listtest a b c
(integer) 4
获取列表指定范围内的元素,LRANGE list_name index_start index_end 如:
127.0.0.1:6379> LRANGE listtest 0 2
1) "c"
2) "b"
3) "a"
添加元素到列表尾:
127.0.0.1:6379> RPUSH listtest 1 2 3
(integer) 6
查看key对应的value类型:
127.0.0.1:6379> TYPE listtest
list
通过索引获取列表中的值:
127.0.0.1:6379> LINDEX listtest 3
"1"
获取列表长度:
127.0.0.1:6379> LLEN listtest
(integer) 6
移除元素:
lrem listtest count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
例子:
127.0.0.1:6379> LRANGE list 0 2
1) "3"
2) "3"
3) "1"
127.0.0.1:6379> LREM list 1 3
(integer) 1
127.0.0.1:6379> LRANGE list 0 2
1) "3"
2) "1"
删除其中某条记录(示例):
127.0.0.1:6379> LPUSH list qq ww ee qq qq tt
(integer) 6
127.0.0.1:6379> LRANGE list 0 5
1) "tt"
2) "qq"
3) "qq"
4) "ee"
5) "ww"
6) "qq"
127.0.0.1:6379> LSET list 3 flag
OK
127.0.0.1:6379> LRANGE list 0 5
1) "tt"
2) "qq"
3) "qq"
4) "flag"
5) "ww"
6) "qq"
127.0.0.1:6379> LREM list 0 flag
(integer) 1
127.0.0.1:6379>
*3.4 set操作*
set是string类型的无序集合。集合成员是唯一的,不允许重复
添加数据到集合:
127.0.0.1:6379> SADD settest 1 2 3 4 5
(integer) 5
返回集合数据:
127.0.0.1:6379> SMEMBERS settest
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
获取集合数量:
127.0.0.1:6379> SCARD settest
(integer) 5
移除集合中的值:
127.0.0.1:6379> SREM settest 5
(integer) 1
*3.5 sorted set操作*
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
有序集合特点:
1.有序集合中每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
2.有序集合的成员是唯一的,但分数(score)却可以重复。
3.有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
添加元素到集合:
127.0.0.1:6379> ZADD sortset 1 a
(integer) 1
注:如果value(a)存在,更新分数,否则添加新value,分数可以相同。
返回指定元素的分数:
127.0.0.1:6379> ZSCORE sortset a
"1"
查询元素,ZRANGE sortset start_index end_index:
127.0.0.1:6379> ZRANGE sortset 0 1
1) "a"
移除集合中的元素:
127.0.0.1:6379> ZREM sortset a
(integer) 1
根据分数区间查询元素
127.0.0.1:6379> ZCOUNT zset 1 10
3.6 有序集合与列表(EXT):
有序集合类型在某些方面和列表类型有些相似:
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的:
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以。
(4)有序集合要比列表类型更耗费内存。有序集合类型算得上是 Redis的5种数据类型中最高级的类型。
**Redis安全****
redis安全常识****
Redis在默认状态可直接登录,也可以设置密码进行安全验证。设置密码时最好设置一个比较复杂的密码,防止暴力破解。因为redis执行速度非常快,正常配置下1s内可以进行150k次密码登录尝试。
redis基于配置安全验证****
打开redis.conf配置文件,做如下配置:
配置完成后,启动redis服务,注意,此时不要点击redis-server.exe启动,因为redis-server.exe启动使用的是默认配置,可以在cmd命令行下启动:
redis设置临时验证****
redis支持临时密码设置:
查看密码
config get requirepass
设置密码
config set requirepass 123
注:这种方式是临时设置密码,如果重启 redis-server 则失效
如下图:
永久设置密码:
修改 redis.window.conf 配置文件,找到 requirepass 参数并设置密码,启动server 时加载配置文件。
登陆时若不指定密码,进入客户端后,执行相关指令会报认证错误:
redis-cli -p 6379
> KEYS *
(error) NOAUTH Authentication required.
> LRANGE list 0 10
(error) NOAUTH Authentication required.
两种通过验证的方式:
或进到客户端里在验证
auth 123 redis-cli -h 127.0.0.1 -p 6379 -a 123
注意-a不是用户名 指的是以认证方式登录 2019年12月10日00:56:27
注意:
使用127.0.0.1:6379> QUIT退出客户端
**Redis持久化****
redis持久化之RDB****
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”),也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全时持久化模式”)。
第一种方法filesnapshotting(RDB):
默认redis是会以快照的形式将数据持久化到磁盘的(一个二进 制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照。
工作原理简单:
当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write
如在修改redis.conf文件:
1.dbfilename dump.rdb 指定持久化数据存放文件(可更改dump.rdb文件名称)
2.dir ./ 默认设置相对路径,此处可指定持久化文件的绝对路径
3.# save <seconds> <changes>........
save 900 1 save 300 10
save 60 10000 可添加或者修改相关参数
redis持久化之AOF****
第二种方法Append-only(AOF):
filesnapshotting方法在redis异常死掉时, 最近的数据会丢失(丢失数据的多少视你save策略的配置),所以这是它最大的缺点,当业务量很大时,丢失的数据是很多的。
Append-only方法可 以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到 redis关闭前的最后时刻。
如修改redis.conf文件:
1.appendonly no 修改为yes可转换为aof模式
2.appendfilename "appendonly.aof" 可修改aof文件名称
3.appendfsync everysec
3.# everysec.
appendfsync always:总是写入aof文件,并完成磁盘同步 appendfsync everysec:每一秒写入aof文件,并完成磁盘同步
appendfsync no:写入aof文件,不等待磁盘同步。
可见,从持久化角度讲,always是最安全的。从效率上讲,no是最快的。而redis默认设置进行了折中,选择了everysec。合情合理。
总之:
Rdb---->备份数据
Aof----->备份指令
Bgsave或者save 触发持久化指令