분류 전체보기
-
[Redis] 레디스 데이터 타입 - List2023.01.20
-
[Redis] 레디스 데이터 타입 - String2023.01.18
-
[Redis] 레디스 Collections 알아보기2023.01.16
-
[Redis] 레디스 개요2023.01.13
-
[Jenkins] 매개변수를 이용한 Git Tag 빌드2023.01.11
-
[gRPC] C# gRPC 서버(Service) 샘플 만들어보기2023.01.09
[Redis] 레디스 데이터 타입 - List
List
- Linked List 형태이며, Head 와 Tail 에 요소를 추가할 때 동일한 시간이 소요됩니다.
- 특정 값이나 인덱스로 데이터를 찾거나 삭제할 수 있습니다.
- List는 다음과 같은 용도로 자주 사용됩니다.
- stack, queue 를 구현합니다.
- 백드라운드 작업자 시스템을 위한 대기열 관리를 구축합니다.
- pub/sub, job queue 로 활용할 수 있습니다.
- Redis List의 최대 길이는 2^32 - 1(4,294,967,295) 입니다.
기본명령
LPUSH <key> <Element1> <Element2> : 앞쪽에 Push
RPUSH <key> <Element1> <Element2> : 뒤쪽에 Push
LPOP <key> : 앞쪽에서부터 꺼냄
RPOP <key> : 뒤쪽에서부터 꺼냄
LLEN <key> : List의 크기를 반환
LRANGE <key> <start> <end> : 범위 내에 값 확인 <end> -1 일 경우, 전체
Example
LPUSH <key> <Element1> <Element2> : 앞쪽에 Push
LPOP <Element> : 앞쪽에서부터 꺼냄
RPUSH <key> <Element1> <Element2> : 뒤쪽에 Push
RPOP <Element> : 뒤쪽에서부터 꺼냄
성능
헤드 또는 테일에 액세스하는 목록 작업은 O(1)이므로 매우 효율적입니다. 그러나 목록 내의 요소를 조작하는 명령은 일반적으로 O(n)입니다. 이러한 예에는 LINDEX, LINSERT및 가 포함 LSET됩니다. 주로 큰 목록에서 작업할 때 이러한 명령을 실행할 때 주의하십시오.
참조
https://redis.io/commands/?group=list
END
'Redis' 카테고리의 다른 글
[Redis] 레디스 데이터 타입 - Hash (0) | 2023.01.25 |
---|---|
[Redis] 레디스 데이터 타입 - Set (0) | 2023.01.23 |
[Redis] 레디스 데이터 타입 - String (0) | 2023.01.18 |
[Redis] 레디스 Collections 알아보기 (0) | 2023.01.16 |
[Redis] 레디스 개요 (0) | 2023.01.13 |
[Redis] 레디스 데이터 타입 - String
String
- 텍스트, 직렬화된 개체 및 이진 배열을 포함하여 바이트 시퀀스를 저장합니다.
- 문자열은 Redis 에서 가장 기본적인 데이터 유형입니다.
- 캐싱에 자주 사용되며, 카우터를 구현하고 비트연산을 수행할 수 있는 추가 기능도 지원
- 단일 Redis 문자열은 최대 512MB 입니다.
기본명령
-- 단일 문자열 저장
SET <key> <value>
GET <key>
-- 다중 문자열 저장
MSET <key1> <value1> <key2> <value2> <key3> <value3> ...
MGET <key1> <key2> <key3> ...
-- 키가 아직 존재 하지 않을 경우에만 문자열 값 저장
SETNX <key> <value>
- Value 가 숫자형태라면, 증감도 가능하다. INCR, INCRBY, INCRBYFLOAT
- atomic 하게 증감하는 커멘드이다.
-- 정수
INCR <key>
INCRBY <key> <number>
-- 부동소수점
INCRBYFLOAT <key> <number>
참조
https://redis.io/commands/?group=string
END
'Redis' 카테고리의 다른 글
[Redis] 레디스 데이터 타입 - Hash (0) | 2023.01.25 |
---|---|
[Redis] 레디스 데이터 타입 - Set (0) | 2023.01.23 |
[Redis] 레디스 데이터 타입 - List (0) | 2023.01.20 |
[Redis] 레디스 Collections 알아보기 (0) | 2023.01.16 |
[Redis] 레디스 개요 (0) | 2023.01.13 |
[Redis] 레디스 Collections 알아보기
들어가며
개인 적으로 좀 더 정리하고자 늦은감은 있지만 Redis에 대해서 정리 중입니다.
Redis 에서 가장 많이 사용되는 Collection에 대한 내용과, 데이터 타입의 종류에 대해서 간략하게 정리해보려고 합니다.
Collection 이 중요한 이유
- 다양한 자료구조를 지원합니다.
- 다양한 자료구조를 Key-Value 형태로 저장합니다.
- 개발의 편의성과 난이도 제공.
- 외부의 Collections을 잘 이용하는 것만으로 개발 시간 단축이 가능하고, 생각하지 못한 여러가지 문제를 줄여줄 수 있으므로 개발자는 비즈니스 로직에 집중할 수 있다는 큰 장점이 존재합니다.
주된 Redis 사용처
원격 데이터 저장소로 사용되며, 각 서버의 데이터를 공유하고 싶을 때 사용됩니다.
- 인증 및 토큰 저장소
- 랭킹
- 유저 세션관리
- Pub/Sub 을 이용한 Backplane
Redis Collections 주의사항
- 데이터 컬렉션을 잘못 선택해서 속도 차이가 날 수 있음.
- Expire는 Collection의 아이템 개별로 걸리지 않고 전체 Collection에 대해서만 걸린다.
- 하나의 컬렉션에 너무 많은 아이템을 담지 않는 것이 좋음. 예를 들어 리스트에 요소가 100000개 들어 있다던가, hash에 key가 10000개 있다던가. 한 컬렉션에는 아이템 n천개 수준이 좋음. 가능하면 1만개를 넘어가지 않게 하자.
레디스 자료 구조
- 문자열 (Strings)
- 리스트 (Lists)
- 집합 (Sets)
- 해시 (Hashes)
- 정렬된 집합 (Sorted Sets)
- 스트림 (Streams)
- 지리공간 인덱스 (Geospatial Indexes)
- 하이퍼로그로그 (HyperLogLog)
- 비트맵 (Bitmaps)
- 비트필드 (Bitfields)
참조
https://ict-nroo.tistory.com/133
https://sjh836.tistory.com/178
https://medium.com/garimoo/개발자를-위한-레디스-튜토리얼-01-92aaa24ca8cc
END
'Redis' 카테고리의 다른 글
[Redis] 레디스 데이터 타입 - Hash (0) | 2023.01.25 |
---|---|
[Redis] 레디스 데이터 타입 - Set (0) | 2023.01.23 |
[Redis] 레디스 데이터 타입 - List (0) | 2023.01.20 |
[Redis] 레디스 데이터 타입 - String (0) | 2023.01.18 |
[Redis] 레디스 개요 (0) | 2023.01.13 |
[Redis] 레디스 개요
들어가며
요즘 서버 환경을 구성하는 단계에서 빠지지 않는 구성중에 하나라고 생각이 듭니다.
개인 적으로 좀 더 정리하고자 늦은감은 있지만 Redis에 대해서 정리하였습니다.
1. Redis 란?
레디스는 REmote DIctionary Server 를 나타내는 약자로서, 2009년 살바토르 산필리포(Salvatore Sanfilippo)가 C언어로 레디스를 개발했다.
Key-Value 형식의 고성능의 In-memory 데이터베이스로서, 모든 데이터를 메모리에 저장하기 때문에 읽기와 쓰기 명령이 매우 빠른 장점을 가지고 있다.
2015년부터 Redis Labs이 지원하고 있으며, 모든 데이터를 메모리로 불러와서 처리하는 메모리 기반 DBMS이다.
개방형 소스 (BSD 라이선스) 를 따른다.
2. Redis의 주요 특징
- 디스크가 아닌 메모리 기반의 데이터 저장소이다. (In-Memory Data Structure Store)
- 레디스는 싱글 스레드로 동작한다.
- 싱글 스레드로 동작하는 서버의 모든 자료구조는 Atomic 하기 때문에 Race Condition을 피해 데이터의 정합성을 보장하기 쉽다.
- 레디스는 빠른 데이터 접근 속도와 데이터의 일관성 (Consistency) 를 보장하기 때문에, 캐싱과 Session 에 많이 사용된다.
- 레디스는 데이터를 디스크에 저장 할 수 있다.
- 레디스의 데이터 영속성 (Data Persistence)은 저장된 데이터를 바이너리 스냅샷으로 생성하거나, 시간에 결쳐 실행된 모든 커맨드를 순서대로 저장해 사람이 읽을 수 있는 파일로 생성함으로써 이루어질 수 있다. 이 두 방식은 스냅샷 (Snapshotting)과 저널링(Journaling) 이다.
- 레디스는 키 만료 (Key Expiration)와, 트랜젝션 (Transaction), 게시/구독(publish/subscribe) 기능을 설정 할 수 있다.
- 부하 분산에 용이한, Master / Slave (Replication) 이 가능하다.
3. Redis의 활용
- Load Balance 개발 환경에서의 User Session 처리
- 게임서버에서의 Ranking 처리
- 3-Tier (Web - WAS - DB) 구조에서의 DB 성능부하를 줄여 줄 Cache 처리
- 웹소켓 환경에서의 각 서버와의 데이터 BroadCast 및 BackPlane 처리를 위한 Redis의 Pub/Sub 기능
- In-Memeory 디비만을 이용한 데이터 저장소 처리
참조
https://meetup.toast.com/posts/224
https://velog.io/@hyeondev/Redis-란-무엇일까
https://velog.io/@mu1616/레디스-Redis의-개념-특징
END
'Redis' 카테고리의 다른 글
[Redis] 레디스 데이터 타입 - Hash (0) | 2023.01.25 |
---|---|
[Redis] 레디스 데이터 타입 - Set (0) | 2023.01.23 |
[Redis] 레디스 데이터 타입 - List (0) | 2023.01.20 |
[Redis] 레디스 데이터 타입 - String (0) | 2023.01.18 |
[Redis] 레디스 Collections 알아보기 (0) | 2023.01.16 |
[Jenkins] 매개변수를 이용한 Git Tag 빌드
들어가며
Git을 이용해서 프로젝트의 Binary 파일을 관리하고 있는데요. 이렇게 관리할 경우 이점은, 필요시에 Binary를 원하는 환경으로 롤백할 수 있다는 이점이 있습니다. 물론 Binary만 교체할 경우에 한해서 입니다.^^ 다른 것과 연결되어 있다면 같이 롤백되어야 하겠지만 간혹 유용하게 사용되고 있습니다.
꼭 이런 경우가 아니더라도, Tag 를 이용해서 관리가 필요한 프로젝트에 용이하게 사용할 수 있을것 같습니다.
1. Git Parameter 설치
기본적으로 Git의 Parameter Type 을 이용하려면, Git Parameter 플러그 인 설치가 되어 있어야 합니다.
주 메뉴의 Jenkins 관리 메뉴에 들어가면, 플러그인을 설치 할 수 있습니다.
Git Parameter 를 검색하시면, 설치 여부를 확인 할 수 있으며, 없을 경우 설치 해주시면 됩니다.
2. Jenkins 프로젝트 구성
Git Parameter 가 설치 되어 있다면, 이제 프로젝트 구성시에 해당 기능을 이용할 수 있는데요.
매개변수를 이용할 경우, 해당 체크박스를 선택하면 이용할 수 있습니다.
Git Parameter 설정시, 변수 이름을 지정 할 수 있는데, 저의 경우는 TAG_NAME 이라는 변수명을 이용했습니다.
여기서 중요한것은 Parameter Type 인데요.
Branch, Tag, Revision 등 원하는 내용을 선택해서 사용 할 수 있습니다.
저는 배포 목적으로 구성된 프로젝트여서, Tag 로 선택을 했습니다.
3. Tag 를 이용한 빌드 진행
Git Parameter 에 사용할 Type 과 Name 이 정해졌다면, 소스 코드 관리 메뉴에서 Git 을 선택해서 기본적인 셋팅을 진행합니다.
여기서 중요한 부분은 Branches to Build 라는 영역인데요.
위에서 Git Parameter 에서 선택한 Name 을 ${변수명} 형태로 기입해주면 됩니다.
Branch 의 경우도 동일하게 셋팅하시면되요.
우측에 있는 (?) 버튼을 누르면, 자세한 사항이 보이니 참고하세요.
4. 매개변수를 이용한 빌드
이제 프로젝트의 빌드 버튼을 선택할 경우, 아래와 같이 Tag 이름이 보여지게 되며, 해당 Tag를 선택 후 빌드버튼을 누를경우, Tag로 빌드가 됩니다.
END
'CI' 카테고리의 다른 글
[Jenkins] Jenkins 복구 후, git cloning remote repo 'origin' 오류 해결 (0) | 2023.05.02 |
---|---|
[Jenkins] 외부에서 Jenkins 호출하기 (0) | 2023.04.03 |
[Jenkins] Git Branch 매개변수를 이용한 빌드 (0) | 2020.07.14 |
[Jenkins] 파워쉘을 이용해서 git log 관리하기 (0) | 2020.07.02 |
[MSBuild] MSBuild 웹 URL 호출 - MSBuild.Extension.Pack (1) | 2020.01.07 |
[gRPC] C# gRPC 서버(Service) 샘플 만들어보기
들어가며
gRPC에 대한 내용을 간단하게 정리해봤으나, 실질적으로 동작하는 부분까지 확인을 직접 해보는게 좋을거 같아서 직접 프로젝트를 구성해봤습니다.
요즘의 서버는 다양한 개발환경으로 구성이 되어 있는데요. 각 서버간의 통신에 RESTFul API를 이용해서 구성하기도 하지만, gRPC를 이용해서 보다 빠른 환경으로 구성할 수 있을 거 같네요.
Service 프로젝트 만들기
새로운 프로젝트를 만들때, gRPC 서비스 템플릿을 이용해서 프로젝트를 생성 할 수 있습니다.
이후 기본적인 위치 및 프로젝트 이름을 생성해서 프로젝트를 만들 수 있습니다.
Client 프로젝트 만들기
클라이언트 프로젝트의 경우에는, 콘솔 어플리케이션 템플릿으로 생성 하였습니다.
이후, 아래의 내용을 참고해서 Nuget Package 를 설치해주시면 됩니다.
.proto 파일에 대한 C# 도구 지원
.proto 파일에서 C# 자산을 생성하려면 도구 패키지 Grpc.Tools가 필요합니다. 생성된 자산(파일)과 관련해서 다음 사항을 확인합니다.
- 프로젝트를 빌드할 때마다 필요에 따라 생성됩니다.
- 프로젝트에 추가되거나 소스 제어에 체크 인되지 않습니다.
- obj 디렉터리에 포함된 빌드 아티팩트입니다.
서버 프로젝트의 경우에는 Grpc.AspNetCore 패키지가 포함되어 있고, 해당 패키지 안에 Grpc.Tools 에 대한 참조가 포함되어 있어서, 별도로 추가 할 필요는 없습니다.
클라이언트 프로젝트의 경우에는 Grpc.Tools 가 따로 포함이 되어 있지 않기 때문에 Nuget.Package 에서 위 내용을 검색 후 설치해 주시면 됩니다.
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
아니면 패키지 관리자 콘솔에서, Install-Package 해주세요~
Client 프로토콜 파일 추가
syntax = "proto3";
option csharp_namespace = "GrpcGreeterClient";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
서버에서 정의한 proto 파일을 클라이언트에도 정의를 해줍니다.
namespace 는 클라이언트에서 사용하도록 변경해주고요. 다른 부분은 동일하게 정의 합니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.21.7" />
<PackageReference Include="Grpc.Net.Client" Version="2.49.0" />
<PackageReference Include="Grpc.Tools" Version="2.49.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
</Project>
Client에서 생성한 파일은 빌드에 포함되지 않다보니, 추가적으로 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.
해당 파일을 Protobuf 속성을 사용해서 Include 해줍니다.
클라이언트 코드 추가
using System;
using System.Threading.Tasks;
using Grpc.Net.Client;
using GrpcGreeterClient;
namespace GrpcSampleClient
{
class Program
{
static async Task Main(string[] args)
{
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
클라이언트 코드는, gRPC 서버에 SayHello Method를 호출하도록 구성하였으며, Request 로 "GreeterClient" 를 인자로 넘기도록 구성된 샘플 코드를 사용하였습니다.
그리고 Response 로 받은 내용을 찍어주는 심플한 코드입니다.
서버 코드 추가
syntax = "proto3";
option csharp_namespace = "GrpcSampleService";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
서버쪽 proto 파일입니다. namespace를 제외하고는 동일합니다.
using Grpc.Core;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace GrpcSampleService
{
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
}
서버쪽 코드는 샘플 예제를 참조하였으며, Request 로 들어온 이름에 "Hello " 텍스트를 붙여서 Response 해줍니다.
결과
gRPC 서버를 먼저 시작해줍니다.
이후 클라이언트를 실행했으며, 서버로 부터 받은 Response 데이터를 정상적으로 출력해주고 있습니다.
서버쪽으로도, 요청이 들어온 Log가 정상적으로 보여지네요.
간단한 샘플 코드를 이용해서, 다양하게 활용하면 좋을 거 같습니다.
END
'Programming' 카테고리의 다른 글
[gRPC] C# 프로토콜 버퍼 사용하기 (0) | 2023.01.06 |
---|---|
[gRPC] 프로토콜 버퍼 (Protocol Buffers) 알아보기. (0) | 2023.01.04 |
[gRPC] gRPC 알아보기 (0) | 2023.01.02 |
[DI] 의존성 관리하기 (2) (0) | 2019.12.25 |
[DI] 의존성 관리하기 (1) (0) | 2019.12.17 |